//中序线索二叉树遍历算法,非递归 void InOrderTraverse_Thr(BiThrTree T) { BiThrTree p = T; while (p != NULL) { while (p->LTag == 0) { //按左线索向下遍历到最左结点 p = p->lchild; } //输出当前结点的数据 printf("| %d | ", p->LTag); printf("%p", p->lchild); printf(" | %c | ", p->data); printf("%p", p->rchild); printf(" | %d |\n", p->RTag); while (p->RTag == 1 && p->rchild != T) { //右指针为线索,按右线索向后遍历 p = p->rchild; //判断右指针是否指向后继结点 if (p->LTag == 0) { break; } printf("| %d | ", p->LTag); printf("%p", p->lchild); printf(" | %c | ", p->data); printf("%p", p->rchild); printf(" | %d |\n", p->RTag); } p = p->rchild; //右指针为孩子结点指针,向右走到下一个结点 } }修改该函数
时间: 2024-03-07 13:51:47 浏览: 28
void InOrderTraverse_Thr(BiThrTree T) {
BiThrTree p = T;
while (p != NULL) {
while (p->LTag == 0) {
p = p->lchild;
}
printf("| %d | ", p->LTag);
printf("%p", p->lchild);
printf(" | %c | ", p->data);
printf("%p", p->rchild);
printf(" | %d |\n", p->RTag);
if (p->RTag == 0) {
// 如果右子树存在,就进入右子树
p = p->rchild;
} else {
// 否则,找到后继结点,可能需要一直向上回溯
BiThrTree q = p->rchild;
while (q->LTag == 1) {
q = q->lchild;
}
p = q;
}
}
}
相关问题
1、编写二叉树基本操作算法(可如下所示函数,也可自定义,能实现即可)①算法5.2中序遍历二叉树T的非递归算法void InOrderTraverse1(BiTree T)②算法5.3先序遍历的顺序建立二叉链表void CreateBiTree(BITree &T) 2、编写主函数,调用上述算法实现二叉树的中序遍历操作。 3、完成实验报告。 三、实验原理、方法和手段 1、根据实验内容编程,上机调试、 得出正确的运行程序。void InOrderTraverse1(BITree T) //算法5.2中序遍历二叉树T的非递归算法LinkStack S; BlTree p; BiTree q=new BiTNode; InitStack(S); p=T; while(plI!StackEmpty(S)) if(p) Push(S,p); //p非空根指针进栈,遍历左子树 p=p->lchild; else Pop(S,q); //p为空根指针退栈,访问根结点,遍历右 子树 cout<<q->data;p=q->rchild; } 1/ while
1、二叉树基本操作算法
```
// 定义二叉树结点
struct BiTNode {
char data;
BiTNode* lchild;
BiTNode* rchild;
};
// 中序遍历二叉树T的非递归算法
void InOrderTraverse1(BiTNode* T) {
LinkStack S;
BiTNode *p, *q;
InitStack(S);
p = T;
while (p || !StackEmpty(S)) {
if (p) {
Push(S, p); //p非空根指针进栈,遍历左子树
p = p->lchild;
} else {
Pop(S, q); //p为空根指针退栈,访问根结点,遍历右子树
cout << q->data;
p = q->rchild;
}
}
}
// 先序遍历的顺序建立二叉链表
void CreateBiTree(BiTNode*& T) {
char ch;
cin >> ch;
if (ch == '#') {
T = nullptr;
} else {
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
```
2、主函数调用上述算法实现二叉树的中序遍历操作
```
int main() {
BiTNode* T = nullptr;
CreateBiTree(T); // 先序遍历建立二叉树
InOrderTraverse1(T); // 中序遍历二叉树
return 0;
}
```
3、实验报告
本次实验实现了二叉树的中序遍历操作,采用了非递归算法,主要思路是使用栈来辅助遍历。同时还实现了先序遍历建立二叉链表的操作。在实现过程中,需要注意对栈的初始化、压栈、弹栈等操作。
中序遍历二叉树t的非递归算法
中序遍历二叉树T的非递归算法可以使用栈来实现。具体步骤如下:
1. 初始化栈S为空,当前节点为根节点T。
2. 当T不为空或栈S不为空时,执行以下步骤:
a. 当T不为空时,将T入栈,T指向T的左子树。
b. 当T为空时,从栈S中弹出节点并访问,T指向弹出节点的右子树。
3. 重复步骤2,直到T为空且栈S为空。
通过这种方式,可以实现中序遍历二叉树的非递归算法。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)