二叉树的非递归后序遍历

二叉树的非递归后序遍历


文章目录

  • 二叉树的非递归后序遍历
  • 前言
  • 一、树和队列的结构和初始化
  • 二、后序遍历
    • 1.获取栈顶的节点
    • 2.后序遍历函数
    • 3.测试代码
  • 总结


前言

二叉树的非递归后序遍历


一、树和队列的结构和初始化

typedef struct TreeNode									//树的结构
{char data;											//数据域char类型struct TreeNode* Lchild;							//左孩子struct TreeNode* Rchild;							//右孩子int flag;
}TreeNode;typedef struct stackNode								//队列的结构
{TreeNode* data;										//data使用指针更好指向树的节点struct stackNode* next;								//next下一指针域
}stackNode;void creatTree(TreeNode** node, char* data, int* index)
{char temp;temp = data[*index];*index += 1;if (temp == '#'){*node = NULL;}else{*node = (TreeNode*)malloc(sizeof(TreeNode));(*node)->data = temp;(*node)->flag = 0;creatTree(&((*node)->Lchild), data, index);creatTree(&((*node)->Rchild), data, index);}
}stackNode* initStack(void)
{stackNode* stack = (stackNode*)malloc(sizeof(stackNode));	//开辟对stack空间stack->data = NULL;											//data指向的节点为NULLstack->next = NULL;											//next下一指针域也是nULLreturn stack;
}

二、后序遍历

1.获取栈顶的节点

代码如下(示例):

stackNode* getTop(stackNode* stack)
{if (isEmplt(stack)){return NULL;}else{stackNode* node = stack->next;						//进栈前判断不为空,创建node,node指向stack的nextreturn node;}
}

2.后序遍历函数

代码如下(示例):

void lastOrder(TreeNode* tree)								//后序遍历
{	TreeNode* node = tree;									//node获取treestackNode* stack = initStack();							//初始化队列stackwhile (node || !isEmplt(stack))							//判断node是否为空或队列是否为空{if (node)											//如果node不为空{push(node, stack);								//入栈node = node->Lchild;							//node指向node的左孩子}else{TreeNode* top = getTop(stack)->data;			//初始化top节点获取栈顶部data指向的树的节点位置if (top->Rchild && top->Rchild->flag == 0)		//如果此时的top节点的右孩子不为空并且top的右孩子节点的状态没有被访问过{top = top->Rchild;							//top指向top的右孩子push(top,stack);							//入栈top = top->Lchild;							//top指向top的左孩子}else{top = pop(stack)->data;						//如果top的右孩子为NULL,则出栈printf("%c", top->data);					//打印出栈节点的datatop->flag = 1;								//并且对此节点的flag值置一}}}
}

3.测试代码

代码如下(示例):

#include 
#include typedef struct TreeNode									//树的结构
{char data;											//数据域char类型struct TreeNode* Lchild;							//左孩子struct TreeNode* Rchild;							//右孩子int flag;
}TreeNode;typedef struct stackNode								//队列的结构
{TreeNode* data;										//data使用指针更好指向树的节点struct stackNode* next;								//next下一指针域
}stackNode;void creatTree(TreeNode** node, char* data, int* index)
{char temp;temp = data[*index];*index += 1;if (temp == '#'){*node = NULL;}else{*node = (TreeNode*)malloc(sizeof(TreeNode));(*node)->data = temp;(*node)->flag = 0;creatTree(&((*node)->Lchild), data, index);creatTree(&((*node)->Rchild), data, index);}
}stackNode* initStack(void)
{stackNode* stack = (stackNode*)malloc(sizeof(stackNode));	//开辟对stack空间stack->data = NULL;											//data指向的节点为NULLstack->next = NULL;											//next下一指针域也是nULLreturn stack;
}void push(TreeNode* treedata, stackNode* stack)
{stackNode* node = (stackNode*)malloc(sizeof(stackNode));	//开创一个node节点node->data = treedata;										//队列node的data指针指向树的节点node->next = stack->next;									//node的next指向stack的nextstack->next = node;											//stack的next指向node
}int isEmplt(stackNode* stack)
{if (stack->next == NULL){return 1;}else{return 0;}
}stackNode* pop(stackNode* stack)
{if (isEmplt(stack)){return NULL;}else{stackNode* node = stack->next;						//进栈前判断不为空,创建node,node指向stack的nextstack->next = node->next;							//stack的next指向node的next,即指向node的next的nextreturn node;}
}stackNode* getTop(stackNode* stack)
{if (isEmplt(stack)){return NULL;}else{stackNode* node = stack->next;						//进栈前判断不为空,创建node,node指向stack的nextreturn node;}
}void lastOrder(TreeNode* tree)								//后序遍历
{	TreeNode* node = tree;									//node获取treestackNode* stack = initStack();							//初始化队列stackwhile (node || !isEmplt(stack))							//判断node是否为空或队列是否为空{if (node)											//如果node不为空{push(node, stack);								//入栈node = node->Lchild;							//node指向node的左孩子}else{TreeNode* top = getTop(stack)->data;			//初始化top节点获取栈顶部data指向的树的节点位置if (top->Rchild && top->Rchild->flag == 0)		//如果此时的top节点的右孩子不为空并且top的右孩子节点的状态没有被访问过{top = top->Rchild;							//top指向top的右孩子push(top,stack);							//入栈top = top->Lchild;							//top指向top的左孩子}else{top = pop(stack)->data;						//如果top的右孩子为NULL,则出栈printf("%c", top->data);					//打印出栈节点的datatop->flag = 1;								//并且对此节点的flag值置一}}}
}void main(void)
{char data[] = "ABD#F##E##C##";int index = 0;TreeNode* tree;creatTree(&tree, data, &index);lastOrder(tree);printf("\n");
}

总结

上述若有错误麻烦请指出,谢谢啦。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部