4.设一棵二叉树的先序遍历序列:ABDFCEGH中序遍历序列为:BFDACGEH (1)画出这棵二叉树 (2)画出这棵二叉树的先序线索二叉树。
时间: 2024-10-22 17:01:38 浏览: 105
(1) 根据给定的先序遍历序列 ABDFCEGH 和中序遍历序列 BFDACGEH,我们可以推断出节点的顺序。先序遍历表示根节点->左子树->右子树,而中序遍历表示左子树->根节点->右子树。通过比较两个序列,我们得知A是根节点,因为它在先序遍历的第一个位置,并且B在中序遍历也排在其前面。
- A (根)
- D (左子树)
- F (左子树的左子树)
- H (右子树的右子树的左子树)
因此,这棵树可以这样构建:
```
A
/ \
B D
/ \ / \
F C E G
\
H
```
(2) 先序线索二叉树是在普通二叉树的基础上,增加从叶子节点到根节点的前驱指针,以便在遍历时能回溯到其父节点。对于这个例子,我们需要添加从F到D,E到B,G到C,以及H到无前驱节点(因为它是最后一个元素)的线索。更新后的树形结构如下:
```
A
/ \
B D
/ \ / \
F->C E G
\
H
```
其中箭头指向的是线索,表示前驱节点的方向。
相关问题
设一棵二叉树的先序、中序遍历序列分别为先序遍历序列:ABDFCEGH 中序遍历序列:BFDAGEHC (1)画出这棵二叉树。(2)画出这棵二叉树的后序线索树。(3)将这棵二叉树转换成对应的树(或森林)。
(1) 根据给定的先序遍历(A B D F C E G H)和中序遍历(B F D A G E H),我们可以推断出树的结构。先序遍历通常根节点在前,左子树再右子树,而中序遍历则是左子树到根再到右子树。通过比较,我们得知A是根节点,B在根的左边,D、F在B下面,C在F右边,E和G在D和F之间,H在最右边。
下面是这棵树的结构示意:
```
A
/ \
B C
/ \ / \
D E F G
\
H
```
(2) 后序遍历线索树是通过在每个节点添加指向前两个兄弟节点的线索来表示后序遍历顺序的。对于这棵树,后序遍历为DBGEHFCA,所以我们可以在节点上添加相应的线索:
```
A
/
B
/ \
D E
/ \ / \
/ F G \
D--B--H-----C
\
G
```
- 空白处代表空节点,有向线表示连接。
- `D`指向`B`和`E`,`B`指向`D`和`H`,`E`无线索,`F`指向`G`,`G`指向`F`和`C`,`C`指向`G`和`A`。
(3) 将这棵二叉树转换成对应的树(或森林),也就是恢复原始的二叉树形式,就是上述已经描述的结构。
1)由树的先序遍历序列和中序遍历序列创建一棵二叉树。(2)输出二叉树的后序遍历序列。测试数据:先序遍历序列:ABDGCEF中序遍历序列:DGBAECF
1. 由树的先序遍历序列和中序遍历序列创建一棵二叉树的步骤:
1.1. 如果先序遍历序列或中序遍历序列为空,则返回空树。
1.2. 取先序遍历序列的第一个元素作为根节点。
1.3. 在中序遍历序列中找到根节点的位置,将中序遍历序列分成左子树和右子树两部分。
1.4. 根据左子树和右子树的长度,在先序遍历序列中分出左子树和右子树的序列。
1.5. 递归地对左子树和右子树进行步骤1-4,分别得到左子树和右子树,将其作为根节点的左右子树。
1.6. 返回根节点。
2. 输出二叉树的后序遍历序列的步骤:
2.1. 如果根节点为空,则返回。
2.2. 递归地输出左子树的后序遍历序列。
2.3. 递归地输出右子树的后序遍历序列。
2.4. 输出根节点的值。
代码如下:
```C++
void CreateTree_HZ(BiTree &T, char hou[], int hl, int hr, char zhong[], int zl, int zr) {
if (hl > hr || zl > zr) { // 先序遍历序列或中序遍历序列为空
T = NULL;
return;
}
T = new BiTNode; // 创建根节点
T->data = hou[hr]; // 取先序遍历序列的最后一个元素作为根节点
int i;
for (i = zl; i <= zr; i++) { // 在中序遍历序列中找到根节点的位置
if (zhong[i] == hou[hr]) {
break;
}
}
int left_len = i - zl; // 左子树的长度
int right_len = zr - i; // 右子树的长度
CreateTree_HZ(T->lchild, hou, hl, hl + left_len - 1, zhong, zl, i - 1); // 递归地对左子树进行步骤1-4
CreateTree_HZ(T->rchild, hou, hl + left_len, hr - 1, zhong, i + 1, zr); // 递归地对右子树进行步骤1-4
}
void postorder(BiTree T) {
if (T == NULL) { // 根节点为空
return;
}
postorder(T->lchild); // 递归地输出左子树的后序遍历序列
postorder(T->rchild); // 递归地输出右子树的后序遍历序列
cout << T->data; // 输出根节点的值
}
```
阅读全文