二叉树是非线性结构,每个结点会有零个、一个或两个孩子结点,一个二叉树的遍历序列不能决定一棵二叉树,但某些不同的遍历序列组合可以惟一确定一棵二叉树。可以证明,给定一棵二叉树的前序遍历序列和中序遍历序列可以惟一确定一棵二叉树的结构。
二叉树节点的定义
typedef struct tnode
{
char data;
struct tnode *leftChild;
struct tnode *rightChild;
}BiTreeNode;
BiTreeNode * tree_buld(string pre, string mid)//利用中序,前序遍历建二叉树
{
if (pre.size() == 0) return NULL; //空的时候,返回NULL, 递归出口1
if (pre.size() == 1) { //只有一个结点,作为根节点
BiTreeNode *root = (BiTreeNode *)malloc(sizeof(BiTreeNode));
root->data = pre[0];
root->leftChild = NULL;//这个不能少
root->rightChild = NULL;// 这个不能少
return root;
}
BiTreeNode *root = (BiTreeNode *)malloc(sizeof(BiTreeNode)); //创建根节点
root->data = pre[0];
int i;
for (i = 0; i < mid.size(); i++) //从中序遍历找出根节点
if (mid[i] == pre[0])
break;
//构造左右子树的前序中序遍历
string pre1 =pre.substr(1,i) ;
string pre2 = pre.substr(i + 1, mid.size());
string mid1 = mid.substr(0, i);
string mid2 = mid.substr(i+1, mid.size());
root->leftChild = tree_buld(pre1,mid1);//递归调用创建左子树
root->rightChild = tree_buld(pre2,mid2);//递归调用创建右子树
return root;
}
测试程序:
void tree_test()
{
string pre = "ABDGCEF", mid = "DGBAECF";
BiTreeNode *root = tree_buld(pre, mid);
}
本文介绍了一种通过前序和中序遍历来构建二叉树的方法,并提供了具体的C语言实现代码。该方法首先从给定的前序遍历序列中获取根节点,然后根据中序遍历找到根节点的位置,以此划分出左子树和右子树对应的序列,最后递归地构建整棵二叉树。
2062

被折叠的 条评论
为什么被折叠?



