二叉树的链接结构
对着书本敲了一个钟的二叉树,被二叉树建立时的输入问题困扰了很久。二叉树的建立一般使用递归算法,将所有节点的数据猛的输入,递归无法停止,二叉树就无法建立。 自己对着书本敲了一次也没发现怎么回事,最后看了一篇博文之后,豁然开朗。我们在输入节点数据的时候,必须输入空闲叶子结点,并用特殊符号标记。
最后自己终于实现了最终的二叉链表的构造及其三种顺序遍历的实现 PS:输入的时候得适当制造一定数量的空节点才能结束二叉树的输入,这个需要个人自己体会。 代码如下:
#include <iostream>
using namespace std;
typedef struct node* pointer;
typedef char datatype;
typedef struct node {
datatype data;
pointer left, right;
}BinTNode;//定义结构体BinTNode
typedef BinTNode* BinTree;//结构体指针BinTree
BinTree Create_Tree()//二叉树的创建
{
BinTree p;
char c;
cin >> c;
if (c == '#')//如果遇到字符串"#",则设该结点值为空
p = NULL;
else
{
p = new node;
p->data = c;
p->left = Create_Tree();
p->right = Create_Tree();
}
return p;//返回二叉树结构体指针
}
void preorder(BinTree T) {//先序遍历
if (T != NULL) {
cout << T->data << " ";
preorder(T->left);
preorder(T->right);
}
}
void inorder(BinTree T) {//中序遍历
if (T != NULL) {
preorder(T->left);
cout << T->data << " ";
preorder(T->right);
}
}
void postorder(BinTree T) {//后序遍历
if (T != NULL) {
preorder(T->left);
preorder(T->right);
cout << T->data << " ";
}
}
int main() {
BinTNode* T;
T = new BinTNode;
cout << "用先序创建二叉树" << endl;
T = Create_Tree();
cout << "\n先序遍历二叉树:" << endl;
preorder(T);
cout << "\n中序遍历二叉树:" << endl;
inorder(T);
cout << "\n后序遍历二叉树:" << endl;
postorder(T);
return 0;
}