给定二叉树,您将如何从左到右加入每个级别的节点.假设第3级有5个节点,从左到右连接所有节点.
我不需要任何人为此编写代码..但只是一个有效的算法.
谢谢
好吧,经过四个小时的调试,我很困惑,我发现了问题的原因......
我正在制作一些程序,在std :: map中保存一些点并在窗口中渲染它们.但奇怪的是,有些观点无法进入地图.
std::map<Point2, Prop*> m_Props_m;
void AddProp(std::pair<Point2, Prop*> p)
{
m_Props_m.insert(p);
}
struct Point2
{
unsigned int Point2::x;
unsigned int Point2::y;
//--------
Point2::Point2()
:x(0)
,y(0)
{}
bool Point2::operator< (const Point2& b) const
{
return ( x+y < b.x+b.y );
}
bool Point2::operator> (const Point2& b) const
{
return ( x+y > b.x+b.y );
}
};
Run Code Online (Sandbox Code Playgroud)
感谢上帝,我对二叉树有一些经验,所以我可以找出问题的原因.
想象一下,我们有2个Point2.
Point2 a(0,1);
Point2 b(1,0);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,使用operator <方法我已经写过它会返回false,而operator>也会返回false.因此,如果a已经在地图中,并且插入了b,则插入失败.
现在,这一切都很好,但我该如何解决这个问题呢?有没有什么方法可以让2D点的运算符少于允许我存储地图中每个唯一点的运算符?
我正在尝试对霍夫曼树进行编码.我的树是对的.我只需要弄清楚如何修复我的递归函数来正确创建表.感谢您提供的任何帮助.
struct Code
{
char letter;
string code;
};
void createCode(BTree<Data>* root,string codeStr,vector<Code> &table)
{
if (root->getRightChild() == NULL && root->getLeftChild() == NULL)
{
Code code;
code.letter = root->getData().getLetter();
code.code = codeStr;
table.push_back(code);
}
else
{
createCode(root->getLeftChild(), codeStr.append("1"),table);
createCode(root->getRightChild(), codeStr.append("0"),table);
}
}
Run Code Online (Sandbox Code Playgroud) 我回到K&R是为了阅读一章,并注意到我之前省略的一个例子.本章介绍二叉树数据类型的主题.我知道在节点中存储新条目,但打印功能让我感到困惑.为什么首先打印左侧部分?
如果它printf是功能中的第一个命令,其次是左和右,它会工作吗?
如果没有 - 为什么呢?
/* treeprint: in-order print of tree p */
void treeprint(struct tnode *p)
{
if (p != NULL) {
treeprint(p->left);
printf("%4d %s\n", p->count, p->word);
treeprint(p->right);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个函数来查找二叉搜索树的高度.我找到了一个似乎应该工作的方法,但我一直得到这个错误,我不知道它有什么问题:PA5.exe中0x00903417处的未处理异常:0xC0000005:访问冲突读取位置0x00000004.
这是我的身高功能......
template <class T>
int BST<T>::height()
{
return displayHeight(mRootNode);
}
template <class T>
int BST<T>::displayHeight(BST<T> *node)
{
if (node = NULL)
{
return 0;
}
int left = displayHeight(node->mLeft);
int right = displayHeight(node->mRight);
if (left > right)
return 1 + left;
else
return 1 + right;
}
Run Code Online (Sandbox Code Playgroud)
这是主要功能的实现......
cout << endl << "height: " << tree.height();
Run Code Online (Sandbox Code Playgroud)
如果我应该包括其他任何内容,请告诉我.谢谢!
如果你有一个二叉树,你如何使用尾递归迭代(按顺序)?我知道尾部递归涉及您在迭代时计算新值,然后当您到达基本情况时,您只需返回累积.但是当你必须调用函数调用两次时,如何为树执行此操作?
二叉树插入:
#include "stdafx.h"
#include <iostream>
using namespace std;
struct TreeNode {
int value;
TreeNode* left;
TreeNode* right;
};
struct TreeType {
TreeNode* root;
void insert(TreeNode* tree, int item);
void insertItem(int value) {
insert(root, value);
}
};
void TreeType::insert(TreeNode* tree, int number) {
if (tree == NULL) {
tree = new TreeNode;
tree->left = NULL;
tree->right = NULL;
tree->value = number;
cout << "DONE";
} else if (number < tree->value) {
insert(tree->left, number);
} else {
insert(tree->right, number);
}
}
int …Run Code Online (Sandbox Code Playgroud) 我正在尝试插入二进制节点.我的代码很复杂,没有希望拯救它,所以我打算重写它(基本上我没有考虑回溯,并没有考虑所有密切关注的算法).
我正在尝试使用顺序遍历插入二进制节点,但我不明白我应该如何回溯.
D
/ \
B E
/ \ / \
A C F
Run Code Online (Sandbox Code Playgroud)
我如何搜索根D的左子树,然后返回并搜索正确的子树?这可能是一个愚蠢的问题,但我很难过.我能想到的最好的是这样的:
if (!root.hasLeftChild) {
root = root.getLeftChild();
recurse(root);
}
Run Code Online (Sandbox Code Playgroud)
但是当我到达底部时,我无法回到根部.此外,它没有解决问题,如果我到达左下方节点,我必须在开始回溯之前填充该节点的两个子节点.
我想我正在以错误的方式思考这个问题.
二叉树(以及因此有序的森林)可以表示为二进制字符串.二进制字符串是通过预先遍历二叉树获得的,每个节点记录1,每个空子树记录一个0(空链接).
这意味着如果我给了一个二叉树,我可以进行前序遍历并生成二进制序列表示.
相反也可能吗?如果我给出了这个二进制序列11011000101101010001,我可以绘制二叉树吗?
binary-tree ×10
c++ ×4
algorithm ×2
recursion ×2
c ×1
huffman-code ×1
java ×1
std ×1
stl ×1
tree ×1