数据结构_二叉树后序遍历

/*
后序遍历二叉树
思路:
1,若当前结点没有左右孩子,则访问并出栈
2,若当前结点有左孩子或右孩子,并且孩子被访问过,则访问并出栈(若当前结点有左右孩子,只要有一个孩子已被访问,那么它的两个孩子都已被访问,这与入栈顺序有关,它的孩子在栈中一定在它的上方)
3,若当前结点有左孩子或右孩子,并且都没有被访问,那么先将右孩子入栈,再将左孩子入栈
*/

void beh_Order(BiTree T)
{
    InitStack(S);
    BiTree pCur,pPre=NULL,p;
    Push(s,T);
    while(!IsEmpty(S)){
        pCur = getTop(stack);
        if((pCur->lchild==NULL && pCur->rchild==NULL) ||
            (pPre!=NULL && (pCur->lchild==pPre || pCur->rchild==pPre)))
        {
            visit(pCur);
            Pop(stack,p);
            pPre = pCur;
        }
        else
        {
            if(pCur->rchild != NULL)
                Push(stack,pCur->rchild);
            if(pCur->lchild != NULL)
                Push(stack,pCur->lchild);
        }
    }
}
时间: 2024-10-11 22:50:38

数据结构_二叉树后序遍历的相关文章

数据结构_二叉树先序遍历

/* 二叉树先序遍历 思路: 1,先访问当前结点,将其入栈(其可能有右孩子) 2,若其存在左结点,执行1 3,若不存在左结点,则将栈顶元素出栈,若其不存在右孩子,继续出栈,若有右孩子,执行1 */ void pre_Order(BTree T) { InitStack(S); BiTree pCur=T; while(pCur || !IsEmpty(S)) //这里的IsEmpty好像不需要 { visit(pCur); Push(S,pCur); pCur = pCur->lchild; w

数据结构实验之求二叉树后序遍历和层次遍历

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2

数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)

数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据.每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的先序遍历序列,第二个字符串表示二叉树的中序遍历序列. 输出 每组第一行输出二叉树的后序遍历序列,第二行输出二叉树的层次遍历序列 示例输入 2 abdegcf dbgeaf

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

SDUTOJ 2173 数据结构实验之求二叉树后序遍历和层次遍历

#include<iostream> #include<stdio.h> #include<queue> #include<string.h> #include<stdlib.h> using namespace std; char s1[100],s2[100],ans[100]; typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTr

Leetcode: Binary Tree Postorder Traversal(二叉树后序遍历)

题目: Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 递归解法(C++版本): /** * Definition for binary

二叉树后序遍历算法实现

对于二叉树的三种遍历方式,它们的难易程度是不一样的,最简单的是先序遍历,其次是中序遍历,最难的是后序遍历方式.但是最难的后序遍历方式,却可以通过最简单的先序遍历方式的变形实现,然后把遍历的结果逆序一下就搞定了.哈哈,物极必反啊! 先看一个最简单的后序的遍历方法的实现,利用先序遍历方式的变形,然后逆序 vector<int> PostOrder(TreeNode *root) { vector<int> result; stack<const TreeNode*> s;

DS二叉树--后序遍历非递归算法

题目描述 求一颗树的后序遍历的非递归算法 要求:必须是非递归算法,使用堆栈对象来实现 建树方法采用“先序遍历+空树用0表示”的方法 算法流程: 输入 第一行输入一个整数t,表示有t个测试数据 第二行起输入二叉树先序遍历的结果,空树用字符‘0’表示,输入t行 输出 逐行输出每个二叉树的后序遍历结果 样例输入 3 AB0C00D00 ABC00D00EF000 ABCD0000E0F00 样例输出 CBDA CDBFEA DCBFEA 提示 #include<iostream> #include&

二叉树后序遍历

对于后序遍历有点难度,,, 主要是在判断的时候要求访问的节点是叶子节点或者是左右节点都已经访问过了, 还有一个值得注意的点就是此处用了指针的指针,,,在栈中每一个都存储是一个地址  so我要定义一个可以存储地址的数组 #include <cstdio>#include <cstdlib>//define _OJ_#define maxsize 100typedef struct tree1{    char data;    struct tree1 *lchild;    str