![](/img/trans.png)
[英]In Order and Pre Order Traversal of Binary Search Tree without recursion in C?
[英]Building Binary Tree from Pre and In order
我正在尝试从有序和预购中构建一个二叉树。 每个节点为数据保留一个整数值。 这些数组时我遇到了一个问题:
预购:3,9,2,6,1,1,1,4
依序:2,9,3,1,1,1,6,4
这是从中提取遍历的原始树:
3
/ \
9 6
/ / \
2 1 4
/ \
1 1
问题在于我编写的函数无法区分连续的相等数字。
这是C语言中的函数:
TREE createTreeFromPreAndIn(int pre[], int in[], int n){
TREE res;
res.root = createTreeFromPreAndInHelper(pre, in, n);
return res;
}
TNODE* createTreeFromPreAndInHelper(int pre[], int in[], int n){
int index;
TNODE* rootL, *rootR, *root;
if (n == 0)
return NULL;
else {
index = findIndex(in, n, pre[0]); //returns the index of the first appearance of pre[0] in 'in'
rootL = createTreeFromPreAndInHelper(pre+1, in, index);
rootR = createTreeFromPreAndInHelper(pre+1+index, in+index+1, n-index-1);
root = createNewTreeNode(pre[0], rootL, rootR);
return root;
}
}
提前致谢
您没有足够的要求来识别确切的图像。 您上面的树也可以表示为
Fig 1 Fig 2 Fig 3
3 3 3
/ \ / \ / \
9 6 9 6 9 6
/ / \ / / \ / / \
2 1 4 2 1 4 2 1 4
/ \ / \
1 1 1 1
/ /
1 1
上面所有的树都根据您的启动给出了相同的顺序和预设置。
按顺序= {2,9,3,1,1,1,6,4}
预购= {3,9,2,6,1,1,1,4}
模棱两可。 因此,您无法使用此信息来确定确切的树。 您必须指定其他信息来解决此问题。
如果要重新创建它,则可以尝试在数组中包括边界。
例如:使用-1来指定no-child(假设我的节点值在任何情况下都不为-1)。
图。1:
依序:{-1,2,-1,9,-1,3,-1,1,-1,1,-1,1,-1,6,-1,4,-1}
预购:{3,9,2,-1,-1,-1,6,1,1,-1,-1,1,-1,-1,4,-1,-1}
图2:
依序:{-1,2,-1,9,-1,3,-1,1,-1,1,-1,1,-1,6,-1,4,-1}
预订:{3,9,2,-1,-1,-1,6,1,1,1,-1,-1,-1,-1,4,-1,-1}
显然,预订会改变,它可以帮助您避免歧义并重新创建所需的结构。
叶节点未完全定义这一事实引起了歧义。 为将要构建的节点定义一个占位符(0或-1),并使用USE进行表示以显示列表的结构。
预购:3(9(2)(0))(6(1(1)(1))(4))有括号,占位符为零,没有括号,相同的数字序列可以用“括号”表示为3 (9(2)(0))(图6(1)(1(1)(4)))。
重复的数字与歧义无关。 数字未定义其在结构中的位置。 相反,事实上这是一个预排序的二叉树,根据定义,每个节点(即父节点)都有左,右子节点,但每个子节点可以是有两个子节点的父节点! 因此,元素列表必须将树“填充”到其叶子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.