二叉树后序遍历

对于后序遍历有点难度,,,

主要是在判断的时候要求访问的节点是叶子节点或者是左右节点都已经访问过了,

还有一个值得注意的点就是此处用了指针的指针,,,在栈中每一个都存储是一个地址  so我要定义一个可以存储地址的数组

#include <cstdio>
#include <cstdlib>
//define _OJ_
#define maxsize 100
typedef struct tree1
{
    char data;
    struct tree1 *lchild;
    struct tree1 *rchild;
} tree1, *tree;

typedef struct stack1
{
    tree *base;
    tree *top;
} stack1, *stack;

stack
creat_stack(void)
{
    stack s;
    s = (stack) malloc (sizeof(stack1));
    s->base = (tree*) malloc (maxsize * sizeof(tree));
    s->top = s->base;
    return s;
}

tree
creat_tree(tree T)
{
    char ch;
    scanf("%c", &ch);
    if(ch == ‘#‘)
        T = NULL;
    else
    {
        T = (tree) malloc (sizeof(tree1));
        T->data = ch;
        T->lchild = creat_tree(T->lchild);
        T->rchild = creat_tree(T->rchild);
    }
    return T;
}

void
push(stack s, tree T)
{
    *s->top++ = T;
}

tree
pop(stack s)
{
    return *--s->top;
}

tree
gettop(stack s)
{
    return *(s->top - 1);
}

int
isempty(stack s)
{
    if(s->top == s->base)
        return 1;
    else
        return 0;
}

//後序遍歷
void
traverse1(tree T)
{
    stack s;
    s = creat_stack();
    tree T1, pre;//當前節點  和  前一個訪問的節點
    T1 = T;    pre = NULL;
    while (T1 != NULL || isempty(s) != 1) {
        while (T1) {//向左走到底
          push(s,T1);
          T1 = T1->lchild;
         }
         T1 = gettop(s);

if(T1->rchild == NULL || T1->rchild == pre)
        //如果无右子树或者前一个访问的就是右子树就访问此树
         {
            printf("%c  ", T1->data);
            pre = T1;
            T1 = NULL;
            pop(s);
         }
         else
            T1 = T1->rchild;
    }

}

void
traverse(tree T)
{
    stack s;
    s = creat_stack();
    while (T || !isempty(s)) {
      while(T)
      {
        push(s,T); //printf("%c\n", T->data);此處是前序遍歷
        T = T->lchild;
      }
      if(!isempty(s))
      {
        T = pop(s);
        printf("%c  ", T->data);//此處是中序遍歷
        T = T->rchild;
      }
    }
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_  //ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif

tree T;
    T = creat_tree(T);
    traverse(T);printf("\n");
    traverse1(T);
    return 0;
}
// ABCD    BDAC    DBCA

时间: 2024-10-11 11:40:28

二叉树后序遍历的相关文章

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

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

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

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

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

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

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

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

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

二叉树后序遍历算法实现

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

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

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

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

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

后续遍历关键在于,当节点的  右子树存在且被访问后  或者是  右子树为空  才能访问自身. 在遍历过程中,先将节点从的左孩子到最左节点压栈, 设置标志变量 flag 来判断是否访问过左孩子, pre指针来指向先前访问过的节点. 所有左孩子压栈后, 最后一个节点的左孩子为空,已被访问p = NULL , 令flag=1 当左孩子被访问时,进入循环,取栈顶节点. 1. 当栈顶节点的右孩子 等于 空  或  前一个被访问的节点  时, 访问该节点, 令pre 等于当前节点,pre = p, 当前节点