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();
TreeNode* n2 = new TreeNode();
TreeNode* n3 = new TreeNode();
TreeNode* n4 = new TreeNode();
TreeNode* n5 = new TreeNode(); //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();
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && n1->left == NULL && n2->left == NULL)
cout << "2. pass" << endl;
else
cout << "2. fail" << endl;
//3. {1,2} expect {2,#,1}
n1 = new TreeNode();
n2 = new TreeNode();
n1->left = n2;
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && ret->left == NULL && ret->right->val == && 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();
n2 = new TreeNode();
n3 = new TreeNode();
n1->left = n2;
n1->right = n3;
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && ret->left->val == && ret->left->left == NULL && ret->left->right == NULL && ret->right->val == && 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();
n2 = new TreeNode();
n3 = new TreeNode();
n1->left = n2;
n2->left = n3;
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && ret->left == NULL && ret->right->val == && ret->right->left == NULL && ret->right->right->val == && 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();
n2 = new TreeNode();
n3 = new TreeNode();
n4 = new TreeNode();
n5 = new TreeNode();
n1->left = n2;
n2->left = n4;
n2->right = n5;
n1->right = n3;
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && ret->left->val == && ret->left->left == NULL && ret->left->right == NULL && ret->right->val == && ret->right->left->val == && ret->right->left->left == NULL && ret->right->left->right == NULL && ret->right->right->val == && 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();
n2 = new TreeNode();
n3 = new TreeNode();
n4 = new TreeNode();
n5 = new TreeNode();
n1->left = n2;
n2->left = n3;
n2->right = n4;
n3->left = n5;
ret = s.upsideDownBinaryTree(n1);
if(ret->val == && ret->left == NULL && ret->right->val == && ret->right->left->val == && ret->right->left->left == NULL && ret->right->left->right == NULL && ret->right->right->val == && ret->right->right->left == NULL && ret->right->right->right->val == && ret->right->right->right->left == NULL && ret->right->right->right->right == NULL)
cout << "7. pass" << endl;
else
cout << "7. fail" << endl;
}

【LeetCode】Binary Tree Upside Down的更多相关文章

  1. 【题解】【BT】【Leetcode】Binary Tree Preorder/Inorder/Postorder (Iterative Solution)

    [Inorder Traversal] Given a binary tree, return the inorder traversal of its nodes' values. For exam ...

  2. 【LeetCode】Binary Tree Level Order Traversal(二叉树的层次遍历)

    这道题是LeetCode里的第102道题. 题目要求: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15 ...

  3. 【LeetCode】Binary Tree Postorder Traversal(二叉树的后序遍历)

    这道题是LeetCode里的第145道题. 题目要求: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很 ...

  4. 【LeetCode】Binary Tree Inorder Traversal(二叉树的中序遍历)

    这道题是LeetCode里的第94道题. 题目要求: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单 ...

  5. 【LeetCode】Binary Tree Preorder Traversal(二叉树的前序遍历)

    这道题是LeetCode里的第144道题. 题目要求: 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很 ...

  6. 【LeetCode】 Binary Tree Zigzag Level Order Traversal 解题报告

    Binary Tree Zigzag Level Order Traversal [LeetCode] https://leetcode.com/problems/binary-tree-zigzag ...

  7. 【leetcode】Binary Tree Zigzag Level Order Traversal

    Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...

  8. 【leetcode】Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  9. 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

随机推荐

  1. 条件随机场(CRF)理论及应用

    http://x-algo.cn/index.php/2016/02/15/conditional-random-field-crf-theory-and-implementation/ 条件随机场( ...

  2. 双数组Trie树(DoubleArrayTrie)Java实现

    http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...

  3. 前端框架 Vue 初探

    一.前言 前几日使用微信网页版时,好奇这个网页用了什么前端框架.用Chrome的开发人员模式一探到底,发现原来用了一个名叫 Angular 的框架.好吧,既然微信用了.那我也最好还是看看.等等,你这篇 ...

  4. [Spring Boot] Introduce to Mockito

    We have the implemetion: @SpringBootApplication public class MockitoDemoApplication { public static ...

  5. 浮动闭合最佳方案:clearfix

    之前给大家介绍两种浮动闭合的办法CSS清除浮动 万能float闭合,得知很多同学都在使用下面的骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} ...

  6. 使用CocoaPods来做iOS程序的包依赖管理

    前言 每种语言发展到一个阶段,就会出现相应的依赖管理工具, 或者是中央代码仓库.比如 Java: maven,Ivy Ruby: gems Python: pip, easy_install Node ...

  7. Android NDK开发篇(六):Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...

  8. 轻松python文本专题-字符与字符值转换

    场景: 将字符转换成ascii或者unicode编码 在转换过程中,注意使用ord和chr方法 >>> print(ord('a')) 97 >>> print(c ...

  9. android中使用SharedPreferences存储数据

    使用SharedPreferences存储数据还是比较简单的 1.添加或修改数据(没有数据就添加,有数据就是修改): SharedPreferences.Editor editor = getShar ...

  10. Socket 编程IO Multiplexing

     Linux Socket 编程中I/O Multiplexing 主要通过三个函数来实现:select, poll,epoll来实现.I/O Multiplexing,先构造一张有关描述符的列表,然 ...