码迷,mamicode.com
首页 > 其他好文 > 详细

中序遍历二叉树+O(1)空间

时间:2015-06-22 11:05:39      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:遍历   递归      二叉树   

问题描述

中序遍历二叉树时,很简单,需要加上递归就可以优雅地实现了。当然,使用递归的话,函数调用栈的空间就会达到O(log n)。那么有什么方式,可以使得中序遍历二叉树的复杂度为O(1)呢?

问题分析

既然要保证O(1)复杂度,那么就不能使用递归调用了。目标方案应该是使用whilefor循环的方式。下面借用一张图来解释(来源:http://www.2cto.com/kf/201402/277873.html):
技术分享

如图所示,需要在多个节点(right指针为空),设置指针指向父节点。这样在遍历的时候,就可以依靠这个指针来返回父节点了。在遍历完后,这些辅助指针会被撤去。

解决方案

这里直接用代码表示出来:

class TreeNode {                                                                
public:                                                                         
    int val;                                                                    
    TreeNode *left, *right;                                                     
    TreeNode(int val) {                                                         
        this->val = val;                                                        
        this->left = this->right = NULL;                                        
    }                                                                           
};     
    void inorderConstSpace(TreeNode *root) {
        while (root != NULL) {
            // if left child is NULL, then just visit root and continue
            if (root->left == NULL) {
                printf("%d\n", root->val);
                root = root->right;
                continue;
            }
            // find preceding node
            TreeNode *pre = NULL;
            for (pre = root->left; pre->right != root && pre->right != NULL; 
                    pre = pre->right) {}
            // if the preceding node is visited for the first time
            if (pre->right == NULL) {
                pre->right = root;
                root = root->left;
            } else {
                // preceding node is visited for the second time
                printf("%d\n", root->val);
                root = root->right;
                pre->right == NULL;
            }
        }
    }

中序遍历二叉树+O(1)空间

标签:遍历   递归      二叉树   

原文地址:http://blog.csdn.net/nisxiya/article/details/46591929

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!