LeetCode------Invert Binary Tree
2016-04-21 21:15
323 查看
题目简介
Invert a binary tree.4 / \ 2 7 / \ / \ 1 3 6 9
to
4 / \ 7 2 / \ / \ 9 6 3 1
Trivia:
This problem was inspired by this
original tweet by Max
Howell:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
自己的解法
[java]public class
Solution {
public TreeNode invertTree(TreeNode root) {
TreeNode temp;
if(root==null)
return root;
else{
temp=root.right;
root.right=invertTree(root.left);
root.left=invertTree(temp);
return root;
}
}
}
这道题目的意思就是实现二叉树的左右子树的互换。读完题目,马上就想到了用递归的方法。递归最重要的两个思想就是
1.确定好递归的出口
2.递归的调用自身
这道题的出口很简单,但是递归的调用自身需要我们稍微加点变换。这个函数的返回值一个二叉树的节点类型那么最后的答案肯定是左右子数均交换完毕的二叉树的根。那么我们在递归调用自身时,不能直接return invertTree(root.left);最后返回的肯定还是根。这里需要我们先定义一个节点保存左子树(不保存的话如果对右子树执行该函数赋值给左子树,那么原本的左子树就会丢失),分别对左右子树调用这个函数。然后再将左右子树调换即可,最后返回root。
Hot解法
看了一下Hot解法的递归实现基本上和我的算法大同小异。这里介绍一下非递归的算法,用栈或者队列都可以实现。[java]
public class
Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
Queue<TreeNode> queue = new LinkedList<TreeNode>();//初始化队列
queue.offer(root);//根节点入队列
while(!queue.isEmpty()){
TreeNode node = queue.poll();//队列第一个元素出队列
TreeNode tmp = node.left;//左右子树交换
node.left = node.right;
node.right = tmp;
if(node.left != null) queue.offer(node.left);//左右子树分别入队列
if(node.right != null) queue.offer(node.right);
}
return root;
}
}
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法