非递归中序遍历二叉树

非递归中序遍历二叉树

非递归中序遍历二叉树的实现思考了好久,想出一个很麻烦的办法,大致思路是先走最左,再回中点,再向右一格,记录已经访问的节点,已经访问过就向上,如此循环,需要记录是否已经访问过,还有要一个指向父母的指针。然后查了一下,有用栈加已经访问标志的,WIKI上有个简单的方式,但近乎于玩杂技,只需要添加parent字段,用prev, current, next三个指针来控制下一步应该如何走,实现如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void traverse_no_recurise(treenode_t *tree_root, pfunc_tree_callback pfcb_traversenode) {
    if (!tree_root)
        return;
    treenode_t *current = tree_root;
    treenode_t *prev = NULL;
    treenode_t *next = NULL;


    while (current) {
        // if we can go left
        if (prev == current->parent) {
            prev = current;       //prepare to go left
            next = current->left_child;
        }
        // if left is empty and Pre is going from left, dump and prepare to go right
        if (next == NULL || prev == current->left_child) {
            pfcb_traversenode(current);
            prev = current;
            next = current->right_child;
        }
        // If we can't go right (leaf) and previous is right, prepare to go back to parent.
        if (next == NULL || prev == current->right_child) {
            prev = current;
            next = current->parent;
        }


        current = next;
    }
}

漂亮的算法!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值