上午突然想研究一下二叉树数据结构,就想写个程序创建二叉树,后面遇到了麻烦,怎么都调试不出来,还是上网才知道了问题的原因,文字的东西不会遗忘,所以把它记下来。
先定义二叉树的节点,不习惯用struct,结点用class表示。
Node.h文件代码如下:
#ifndef NODE_H
#define NODE_H
class Node
{
public:
int data;
Node *left;
Node *right;
};
#endif
关键是Node.cpp, 这里我用两种方法, 代码如下:
#include <iostream>
#include "Node.h"
using namespace std;
void CreateBiTree(Node *&root);
//*&root参数很关键,表示引用root指针地址的值, 没有&,就表示指针地址的复制
Node* CreateBiTree();
void PreOrderTraverse(Node *root);
int main()
{
Node *rootNode = NULL;
rootNode = CreateBiTree();
//或者用直接调用CreateBiTree(rootNode);
PreOrderTraverse(rootNode);
return 0;
}
void CreateBiTree(Node *&root)
{
int value;
cin >> value;
if (value == -1) {
root = NULL;
}
else {
root = new Node();
root->data = value;
CreateBiTree(root->left);
CreateBiTree(root->right);
}
}
Node* CreateBiTree()
{
Node *tree = new Node();
int nodeValue;
cin >> nodeValue;
if (nodeValue == -1)
tree = NULL;
else
{
tree->data = nodeValue;
tree->left = CreateBiTree();
tree->right = CreateBiTree();
}
return tree;
}
void PreOrderTraverse(Node *root)
{
if (root) {
cout << root->data << " ";
PreOrderTraverse(root->left);
PreOrderTraverse(root->right);
}
}
这样就大功告成了,CreateBiTree(Node *&root) 参数很重要,否则main函数中的root的地址和CreatBiTree函数中的root地址不同。