• 【LeetCode】Binary Tree Upside Down


    Binary Tree Upside Down

    Given a binary tree where all the right nodes are either leaf nodes
    with a sibling (a left node that shares the same parent node) or empty,
    flip it upside down and turn it into a tree where the original right nodes
    turned into left leaf nodes. Return the new root.

    For example:
    Given a binary tree {1,2,3,4,5},
      1
       /
      2  3
       /
      4  5
    return the root of the binary tree [4,5,2,#,#,3,1].
       4
      /
       5  2
      /
     3  1

    由于该树的特性,右子树只能是叶节点,因此使用一个栈就能记录从根节点到最左节点。

    这些栈中的节点将逆序成为新的右子树的根节点。

    原先的父节点成为右子节点,原先父节点的右子节点成为左子节点。

    class Solution {
    public:
        TreeNode *upsideDownBinaryTree(TreeNode *root) 
        {
            if(root == NULL)
                return root;
    
            stack<TreeNode*> s;    //left child list
            s.push(root);
            TreeNode* cur = root;
            while(cur->left)
            {
                s.push(cur->left);
                cur = cur->left;
            }
            TreeNode* newroot = s.top();
            cur = newroot;
            s.pop();
            while(!s.empty())
            {
                TreeNode* oldfather = s.top();
                s.pop();
                cur->left = oldfather->right;
                cur->right = oldfather;
                cur = oldfather;
                //reset
                cur->left = NULL;
                cur->right = NULL;
            }
            return newroot;
        }
    };

    我设计的测试用例如下,全部通过:

    int main()
    {
        Solution s;
        TreeNode* n1 = new TreeNode(1);
        TreeNode* n2 = new TreeNode(2);
        TreeNode* n3 = new TreeNode(3);
        TreeNode* n4 = new TreeNode(4);
        TreeNode* n5 = new TreeNode(5);
        
        //1. {} expect {}
        TreeNode* ret = s.upsideDownBinaryTree(NULL);
        if(ret == NULL)
            cout << "1. pass" << endl;
        else
            cout << "1. fail" << endl;
        //2. {1} expect {1}
        n1 = new TreeNode(1);
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 1 && n1->left == NULL && n2->left == NULL)
            cout << "2. pass" << endl;
        else
            cout << "2. fail" << endl;
        //3. {1,2} expect {2,#,1}
        n1 = new TreeNode(1);
        n2 = new TreeNode(2);
        n1->left = n2;
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 2 && ret->left == NULL && ret->right->val == 1 && ret->right->left == NULL && ret->right->right == NULL)
            cout << "3. pass" << endl;
        else
            cout << "3. fail" << endl;
        //4. {1,2,3} expect {2,3,1}
        n1 = new TreeNode(1);
        n2 = new TreeNode(2);
        n3 = new TreeNode(3);
        n1->left = n2;
        n1->right = n3;
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 2 && ret->left->val == 3 && ret->left->left == NULL && ret->left->right == NULL && ret->right->val == 1 && ret->right->left == NULL && ret->right->right == NULL)
            cout << "4. pass" << endl;
        else
            cout << "4. fail" << endl;
        //5. {1,2,#,3} expect {3,#,2,#,1}
        n1 = new TreeNode(1);
        n2 = new TreeNode(2);
        n3 = new TreeNode(3);
        n1->left = n2;
        n2->left = n3;
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 3 && ret->left == NULL && ret->right->val == 2 && ret->right->left == NULL && ret->right->right->val == 1 && ret->right->right->left == NULL && ret->right->right->right == NULL)
            cout << "5. pass" << endl;
        else
            cout << "5. fail" << endl;
        //6. {1,2,3,4,5} expect {4,5,2,#,#,3,1}
        n1 = new TreeNode(1);
        n2 = new TreeNode(2);
        n3 = new TreeNode(3);
        n4 = new TreeNode(4);
        n5 = new TreeNode(5);
        n1->left = n2;
        n2->left = n4;
        n2->right = n5;
        n1->right = n3;
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 4 && ret->left->val == 5 &&  ret->left->left == NULL && ret->left->right == NULL && ret->right->val == 2 && ret->right->left->val == 3 && ret->right->left->left == NULL && ret->right->left->right == NULL && ret->right->right->val == 1 && ret->right->right->left == NULL && ret->right->right->right == NULL)
            cout << "6. pass" << endl;
        else
            cout << "6. fail" << endl;
        //7. {1,2,#,3,4,5} expect {5,#,3,4,2,#,#,#,1}
        n1 = new TreeNode(1);
        n2 = new TreeNode(2);
        n3 = new TreeNode(3);
        n4 = new TreeNode(4);
        n5 = new TreeNode(5);
        n1->left = n2;
        n2->left = n3;
        n2->right = n4;
        n3->left = n5;
        ret = s.upsideDownBinaryTree(n1);
        if(ret->val == 5 && ret->left == NULL &&  ret->right->val == 3 && ret->right->left->val == 4 && ret->right->left->left == NULL && ret->right->left->right == NULL && ret->right->right->val == 2 && ret->right->right->left == NULL && ret->right->right->right->val == 1 && ret->right->right->right->left == NULL && ret->right->right->right->right == NULL)
            cout << "7. pass" << endl;
        else
            cout << "7. fail" << endl;
    }
  • 相关阅读:
    curl continue
    actor
    nginx
    jmx additional port
    diff
    lsof
    zk reconnect
    Python:Python基础(一)
    Python:初识Python(二)
    Python:初识Python(一)
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4191393.html
Copyright © 2020-2023  润新知