我正在尝试从按顺序和预订中构建二叉树。 每个节点都包含数据的整数值。 我有这些数组时遇到问题:
预购:3,9,2,6,1,1,1,5
按顺序: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;
}
}
提前致谢
答案 0 :(得分:1)
您没有足够的要求来识别确切的图像。您上面的树也可以表示为
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}
存在歧义。因此,您无法使用此信息识别确切的树。您必须指定其他信息才能解决此问题。
如果要重新创建它,可以尝试在数组中包含边界。
对于ex: 使用-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 }
显然,预购将会改变,它可以帮助您避免歧义并重新创建所需的结构。
答案 1 :(得分:0)
模糊性源于叶节点未完全定义的事实。为不要构建的节点定义占位符(0或-1),并使用USE parens显示列表的结构。
预购:3(9(2)(0))(6(1(1)(1))(4))与parens和占位符零没有parens相同的数字序列可以“括号“为3(9(2)(0))(6(1)(1(1)(4)))。
重复的数字与歧义无关。数字未定义其在结构中的位置。相反,这是一个预订二叉树的事实,其中每个节点(即父母)根据定义左右儿童,但每个孩子可以是有两个孩子的父母!因此,元素列表必须将树“填充”到它的叶子。