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

时隔一年多,对二叉树的了解也就停留了一年前的水平,后序遍历的非递归写法还是很有意思的,模拟了栈的运行。值得注意的一些细节

  1. 树为空树的处理
  2. 对递归栈的深入了解至关重要
  3. 非递归写法模拟了递归写法的栈(方便后序讲解)

非常仓促的拍了一个比较仓促的并且比较丑的代码, RE了一发QAQ..。
注:以下代码值得信任,A过题了已经

#include <bits/stdc++.h>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a));
const int maxn = 100000;
struct TREENODE {
    TREENODE(char c):data(c){};
    char data;
    TREENODE *lchild, *rchild;
};
int pos = 0;
char ans[maxn], ans1[maxn];
int top = 0, top1 = 0;;
TREENODE * insert(TREENODE * root, char _data[]);
void postOrderTravel1(TREENODE * root);
void postOrderTravel2(TREENODE * root);
void inOrder(TREENODE * root);
int main() {
    char s[maxn];
    while(~scanf("%s", s)) {
        top = top1 = 0;
        pos = 0;
        int len = strlen(s);
        TREENODE * root = insert(root, s);
        postOrderTravel2(root);
        inOrder(root);
        for(int i = 0; i < top1; i++) {
            printf("%c", ans1[i]);
        }
        puts("");
        for(int i = 0; i < top; i++) {
            printf("%c", ans[i]);
            //if(i != top - 1) printf(" ");
        }
        puts("");
    }
    return 0;
}
TREENODE * insert(TREENODE * root, char _data[]) {
    if(_data[pos++] == ',') {
        root = NULL;
        return root;
    }
    root = new TREENODE(_data[pos - 1]);
    root -> lchild = insert(root -> lchild, _data);
    root -> rchild = insert(root -> rchild, _data);
    return root;
};
void postOrderTravel1(TREENODE * root) {
    if(!root) return;
    postOrderTravel1(root -> lchild);
    postOrderTravel1(root -> rchild);
    ans[top++] = root -> data;
}
void postOrderTravel2(TREENODE * root) {
    stack<TREENODE *> s;
    TREENODE *pre = NULL;
    while(!s.empty()) s.pop();
    if(root) // if root is NULL will RunTimeError
        s.push(root);
    while(!s.empty()) {
        TREENODE * now = s.top();
        bool f = (pre != NULL) && (now -> lchild == pre || now -> rchild == pre);
        if((now -> lchild == NULL && now -> rchild == NULL) || f) {
            ans[top++] = now -> data;
            s.pop();
            pre = now;
            continue;
        }
        if(now -> rchild) {
            s.push(now -> rchild);
        }
        if(now -> lchild) {
            s.push(now -> lchild);
        }
    }
}
void inOrder(TREENODE * root) {
    if(!root) return;
    inOrder(root -> lchild);
    ans1[top1++] = root -> data;
    inOrder(root -> rchild);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值