//陈越 二叉树后序遍历的非递归实现的节点二次入栈实现
#include <stdio.h>
#include <stdlib.h>
struct BinTreeNode{
int Element;
int Time;//入栈次数
struct BinTreeNode* Left;
struct BinTreeNode* Right;
};
//以下代码用于建树,便于测试中序遍历程序是否正确
struct BinTreeNode* CreateNode(int data){//创造新节点
struct BinTreeNode* temp;
temp=(struct BinTreeNode*)malloc(sizeof(struct BinTreeNode));
if(temp!=NULL){
temp->Element=data;
temp->Time=0;
temp->Left=NULL;
temp->Right=NULL;
}
return temp;
}
struct BinTreeNode* FindNode(struct BinTreeNode* BinTree,int data)//查找
{
if(BinTree==NULL)
return NULL;
if(BinTree->Element==data)
return BinTree;
struct BinTreeNode* temp=NULL;
if(BinTree->Left!=NULL)
temp=FindNode(BinTree->Left,data);
if(temp==NULL&&BinTree->Right!=NULL)
temp=FindNode(BinTree->Right,data);
return temp;
}
//假设每个节点值不同
#define LEFT 1
#define RIGHT 0
struct BinTreeNode* InsertNode(struct BinTreeNode* BinTree,int loc,int dir,int data)//插入节点,loc代表插入的数的父节点的值,dir表示方向
{
struct BinTreeNode* parent=FindNode(BinTree,loc);
if(parent!=NULL){
struct BinTreeNode* temp=CreateNode(data);
if(dir==LEFT)
parent->Left=temp;
else
parent->Right=temp;
}
return BinTree;
}
void PostOrderTrversal(struct BinTreeNode* BinTree)
{
//建栈
struct BinTreeNode* stack[100];
int top=-1;
struct BinTreeNode* Temp=BinTree;
while(Temp!=NULL||top>=0){
while(Temp!=NULL){//遍历 (子)树左路径
top++;
stack[top]=Temp;
stack[top]->Time++;
Temp=Temp->Left;
}
if(top>=0){
if(stack[top]->Time==2){
printf("%d ",stack[top]->Element);
top--;
}
else{
stack[top]->Time++;
Temp=stack[top]->Right;
}
}
}
return;
}
int main()
{
struct BinTreeNode* BinTree;
//先手工创建一个树 //不提倡此类建树方法,只是暂时用于测试程序
BinTree=CreateNode(10);
BinTree=InsertNode(BinTree,10,1,20);
BinTree=InsertNode(BinTree,10,0,30);
BinTree=InsertNode(BinTree,30,1,40);
BinTree=InsertNode(BinTree,40,0,50);
//遍历
PostOrderTrversal(BinTree);
return 0;
}
二叉树后序遍历的非递归实现->陈越 节点二次入栈实现的变形
最新推荐文章于 2024-07-17 12:11:36 发布