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

完全二叉树结点数

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

该题目可以用二叉树的Morris遍历来实现空间复杂度为o(1),时间复杂度为o(n)
/**
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    int nodeNum(struct TreeNode* head) {
        if(head == nullptr)
            return 0;
        int count = 0;
        TreeNode* cur = head;
        TreeNode* mostRight;
        while(cur){
            if(cur->left){
                mostRight = cur->left;
                while(mostRight->right != nullptr && mostRight->right != cur){		//mostRight表示当前节点的左子树的最右节点
                    mostRight = mostRight->right;
                }
                if(mostRight->right == nullptr){		//如果是第一次到达,则将最右节点的右指针指向当前节点,然后cur指向左孩子
                    mostRight->right = cur;
                    cur = cur->left;
                    continue;
                }else{
                    mostRight->right = nullptr;		//如果是第二次到达,则将最右节点的右孩子恢复nullptr
                }
            }
            count++;
            cur = cur->right;//左子树为空时,则当前节点向右指向

            
        }
        return count;
    }
};
全部评论

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务