算法思想:
步骤一:
(1)、如果结点有左子树,该节点入栈
(2)、如果该节点没有左子树,访问该节点
步骤二:
(1)如果结点有右子树,重复步骤一
(2)如果结点没有右子树(节点访问结束),根据栈顶指示回退,访问栈顶元素并访问右子树重复步骤一,
(3)如果栈为空,遍历结束
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
//二叉链表示法
typedef struct BiTNode
{
int data;
BiTNode *lchild, *rchild;
};
typedef struct BiTNode* Bitree;
//一直往左走,找到中序遍历的起点
BiTNode * goLeft(BiTNode * root, stack<BiTNode*> &s)
{
if (root == NULL)
{
return root;
}
//判断有没有左孩子 若没有把root return
//如果有root入栈,再往左走
while (root->lchild!=NULL)
{
s.push(root);
root = root->lchild;
}
return root;
}
void InOrder2(BiTNode *root)
{
if (root == NULL)
{
return;
}
BiTNode* t = NULL;
stack<BiTNode*> s;
t=goLeft(root,s);
while (t)
{
printf("%d ",t->data);
//如果t有右子树 重复步骤1
if (t->rchild != NULL)
{
t = goLeft(t->rchild,s);//右子树中中序遍历的起点
}
else if (!s.empty())//如果t没有右子树更具栈顶指示回退
{
t = s.top();
s.pop();
}
else//如果t没有右子树 并且栈为空
{
t = NULL;
}
}
}
//中序遍历
void InOrder(BiTNode *root)
{
if (root == NULL)
{
return;
}
//遍历左子树
InOrder(root->lchild);
printf("%d ", root->data);
//遍历右子树
InOrder(root->rchild);
}
int main()
{
BiTNode t1, t2, t3, t4, t5;
memset(&t1, 0, sizeof(BiTNode));
memset(&t2, 0, sizeof(BiTNode));
memset(&t3, 0, sizeof(BiTNode));
memset(&t4, 0, sizeof(BiTNode));
memset(&t5, 0, sizeof(BiTNode));
t1.data = 1;
t2.data = 2;
t3.data = 3;
t4.data = 4;
t5.data = 5;
t1.lchild = &t2;
t1.rchild = &t3;
t2.lchild = &t4;
t3.lchild = &t5;
//PreOder(&t1);
//printf("\npre\n");
printf("\n递归遍历\n");
InOrder(&t1);
printf("\n非递归遍历-中序\n");
InOrder2(&t1);
//PostOrder(&t1);
//printf("\npost\n");
system("pause");
//LeafCount(&t1);
//printf("叶子结点个数 %d\n", num);
//printf("树的高度: %d\n", DepthTree(&t1));
//BiTNode* root = CopyTree(&t1);
//PreOder(root);
//printf("\npre\n");
system("pause");
return 0;
}