题解 | #完全二叉树结点数#

完全二叉树结点数

http://www.nowcoder.com/practice/512688d2ecf54414826f52df4e4b5693

/**
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    //现在用Morris遍历重新写一遍(最优解)。时间复杂度O(N),空间复杂度O(1)
    //凡是以遍历作为最优解的二叉树题目,Morris遍历都可以作为最优解
    //返回以root作为根节点的完全二叉树的节点数
    int Morris(TreeNode*root){
        int res=0;//最终的返回结果
        if(root==NULL)
            return 0;
        TreeNode*cur=root;
        while(cur){
            TreeNode*mostRight=cur->left;
            if(mostRight){//当此时的节点有左子树时,找到左子树上的最右节点
                while(mostRight->right&&mostRight->right!=cur){
                    mostRight=mostRight->right;
                }
                if(!mostRight->right){//当来到最右节点且是第一次来到cur节点
                    res++;
                    mostRight->right=cur;
                    cur=cur->left;
                }
                else{//说明此时是第二次来到cur了什么也不做
                    mostRight->right=NULL;
                    cur=cur->right;
                }
            }
            else{//说明当前节点没有左子树
                res++;
                cur=cur->right;
            }
        }
        return res;
    }
    int nodeNum(struct TreeNode* head) {
        return Morris(head);
    }
};
全部评论

相关推荐

10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务