二叉树的建立与遍历
前序
建立是 赋值 左子树 右子树
遍历是 输出 左子树 右子树
代码
#include <iostream>
struct BinaryTreeNode
{
double m_dbValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
void creatTree(BinaryTreeNode* &root)
{
double value;
std::cin >> value;
if (value == -1)
{
root = nullptr;
return;
}
else
{
root = new BinaryTreeNode();
root->m_dbValue = value;
}
creatTree(root->m_pLeft);
creatTree(root->m_pRight);
}
void traverse(BinaryTreeNode* root)
{
if (root == nullptr)
return;
std::cout << root->m_dbValue << " ";
traverse(root->m_pLeft);
traverse(root->m_pRight);
}
int main()
{
BinaryTreeNode* root;
BinaryTreeNode* subRoot;
std::cout << "建立主树:";
creatTree(root);
traverse(root);
std::cout << "建立子树:";
creatTree(subRoot);
traverse(subRoot);
}
当指针未初始化时
BinaryTreeNode* root;
creatTree(root);
void creatTree(BinaryTreeNode* root)
会报错
使用未初始化的局部变量
void creatTree(BinaryTreeNode* &root)
这样则不会报错。
指针是一个地址,指针的初始化就是让指针指向一个确定的地址。
这样操作是否有问题,关键在于root(实参)本身是否有问题。如果root本身指向了一个确切的地址,则root=root也使root(形参)实际指向了一个确切的地址,如果root本身没初始化,那么root = root 也使root实际指向了一个未初始化的地址。
BinaryTreeNode* root = new BinaryTreeNode();
void creatTree(BinaryTreeNode* root)
这样传递会导致建立失败,因为creatTree会重新设置root指向的地址。而原始root还是指向初始分配的地址。