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. 【RPC】跨语言-RPC框架

    跨语言-RPC框架 跨语言 rpc_百度搜索 (5 条消息)谁能用通俗的语言解释一下什么是 RPC 框架? - 知乎 跨语言RPC框架Hessian.Thrift.Protocol Buffer之间的 ...

  2. [Algorithm] Check if a binary tree is binary search tree or not

    What is Binary Search Tree (BST) A binary tree in which for each node, value of all the nodes in lef ...

  3. Mybatis特殊值Enum类型转换器-ValuedEnumTypeHandler

    引言 typeHandlers 阅读官方文档 typeHandlers 一节 {:target="_blank"} MyBatis 在预处理语句(PreparedStatement ...

  4. Selenium2(webdriver)入门之TestNG的安装与简单使用

    上一篇已经搭建好了Eclipse+selenium2的环境,这一篇主要记录下TestNG的使用. 一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Inst ...

  5. Mongodb3安装授权

    (1) mongodb 官网下载解压包mongodb-win32-x86_64-3.0.7.zip解压释放在d盘,目录为mongodb,接下来手动创建data文件夹和log文件夹分别用于存放数据和日志 ...

  6. MAC LINUX 安装PYQT(事例)

    MAC安装 1.安装命令:brew install pyqt Warning: Your Xcode () is outdated Please install Xcode 5.0. Warning: ...

  7. python __setattr__和__getattr__

    通过为dict添加__setattr__和__getattr__, 可以属性的语法访问dict的元素 http://www.2cto.com/kf/201507/413971.html class S ...

  8. @Service注解的使用

    首先,在applicationContext.xml文件中加一行: <context:component-scan base-package="com.hzhi.clas"/ ...

  9. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  10. AOP技术分析

    AOP的概述(http://www.cnblogs.com/lxp503238/p/6837653.html)        1. 什么是AOP的技术?        * 在软件业,AOP为Aspec ...