首页 > 技术文章 > 【LeetCode】Binary Tree Upside Down

ganganloveu 2014-12-29 12:11 原文

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;
}

 

推荐阅读