当前位置: 代码迷 >> 综合 >> 树的非递归遍历(使用c语言)
  详细解决方案

树的非递归遍历(使用c语言)

热度:30   发布时间:2024-02-22 10:34:41.0
#include <stdio.h>
#include <string.h>
#include "knLinklist.h"
#include "knLinkstack.h"//二叉链表
typedef struct BiNode{int data;struct BiNode *lchild, *rchild;
}BiNode, *BiTree;#if 1
//找到向左走,找到中序遍历的起点
BiNode *goLeft(BiNode *T, LinkStack *s)
{if (T == NULL){return NULL;}//判断T有没有左孩子, 没有把T return ;//如果有 T入栈 ,再往左走while (T->lchild != NULL){LinkStack_Push(s, (void*)T);T = T->lchild;}return T;
}void inorder2(BiNode *T)
{BiNode *t = NULL;LinkStack * s = LinkStack_Create();t = goLeft(T, s);					//如果结点有左子树, 该结点入栈;while (t){printf("%d ", t->data);			//如果结点没有左子树,访问该结点(就是打印该节点);//如果 t有右子树 重复步骤1if (t->rchild != NULL){t = goLeft(t->rchild, s);	//右子树中中序遍历的起点}else if (LinkList_Length(s) > 0){	//如果t没有右子树 根据栈顶指示 回退t = (BiNode*)LinkStack_Pop(s);}else{	//如果t没有右子树 并且栈为空,表示遍历结束t = NULL;}}
}//中序遍历 左根右 Middle order traversal
void inOrder(BiNode *root)
{if (root == NULL){return;}//遍历左子树inOrder(root->lchild);printf("%d ", root->data);//打印根//遍历右子树inOrder(root->rchild);
}/*t1/    \t2    t3/       /t4	     t5
*/
void test()
{BiNode t1, t2, t3, t4, t5;memset(&t1, 0, sizeof(BiNode));memset(&t2, 0, sizeof(BiNode));memset(&t3, 0, sizeof(BiNode));memset(&t4, 0, sizeof(BiNode));memset(&t5, 0, sizeof(BiNode));t1.data = 1;t2.data = 2;t3.data = 3;t4.data = 4;t5.data = 5;//建立树关系t1.lchild = &t2;	//t1的左孩子为t2t1.rchild = &t3;	//t1的右孩子为t3t2.lchild = &t4;	//t2的左孩子为t4t3.lchild = &t5;	//t3的左孩子为t5printf("\n 中序遍历 inorder\n");inOrder(&t1);printf("\n\n 中序遍历 使用非递归算法\n");inorder2(&t1);
}
#endifint main()
{test();printf("\n---------hello\n");system("pause");
}

 

  相关解决方案