例如输入:
8
/
6 10
/ /
5 7 9 11
输出:
8
/
10 6
/ /
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the
binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
分析:题目中有提示用到递归和循环,首先我们根据题目的题型很容易想到用递归,即递归交换左右孩子,所以很容易想到递归方法,难的就是实现。之后再由递归变循环----这个非常像树的三种遍历(递归与非递归实现)讲到的变换方法,就是利用栈或队列实现。
方法一:递归法
import java.util.* ; public class BinaryMirror{ public static void main(String args[]){ MyBinrryTree tree = new MyBinrryTree() ; tree.add(8); tree.add(6); tree.add(10); tree.add(5); tree.add(7); tree.add(9); tree.add(11); tree.println(tree.root) ; //没镜像前的输出 tree.println(reversal(tree.root)) ; //镜像后的输出 } public static MyTreeNode reversal(MyTreeNode root){ MyTreeNode temp = null ; temp = root.left ; root.left = root.right ; root.right = temp ; if(root.left!=null) reversal(root.left) ; if(root.right!=null) reversal(root.right) ; return root ; } } class MyTreeNode{ int key ; MyTreeNode left ; MyTreeNode right ; public MyTreeNode(int x){ key = x ; } } class MyBinrryTree{ MyTreeNode root ; public void add(int value){ MyTreeNode newNode = new MyTreeNode(value) ; if(root==null){ root = newNode ; }else{ MyTreeNode x = null ; MyTreeNode y = root ; while(y!=null){ if(newNode.key<y.key){ x = y ; y = y.left ; }else{ x = y ; y = y.right ; } } if(newNode.key<x.key){ x.left = newNode ; }else{ x.right = newNode ; } } } //二叉树的层次遍历,层次遍历需要用到队列,我们用LinkedList(实现了Queue接口)来实现 public void println(MyTreeNode root){ LinkedList<MyTreeNode> queue = new LinkedList<MyTreeNode>() ; queue.add(root) ; MyTreeNode n ; while(queue.size()!=0){ //注意能使使用queue!=null因为queue初始化本来就不是null n = queue.poll() ; System.out.println(n.key) ; if(n.left!=null){ queue.add(n.left) ; } if(n.right!=null){ queue.add(n.right) ; } } } }
总结:用到的知识点有①.二叉查找树的实现 ②.层次遍历的实现 ③.双层递归法 递归不熟悉的可看:彻底理解递归
方法二:循环法(只把实现镜像翻转的函数代码列出来,其他部分一样)
public static MyTreeNode reversal(MyTreeNode root){ MyTreeNode temp = null ; MyTreeNode n = null ; LinkedList<MyTreeNode> queue = new LinkedList<MyTreeNode>() ; queue.add(root) ; while(queue.size()!=0){ n = queue.poll() ; if(n.left!=null) queue.add(n.left) ; if(n.right!=null) queue.add(n.right) ; temp = n.left ; n.left = n.right ; n.right = temp ; } return root ; }
总结:其实只要你熟悉树的三种遍历(递归与非递归实现),这个问题就很简单了,就是利用到队列存储来实现循环交换。
最后总结下,这道题又说明了《Thinking In Algorithm》系列有多重要了,其中的
基本上自己掌握了上面两篇博客的话,这种类型的题目肯定没问题的。
作者:SpeedMe 发表于2014-4-16 14:53:53 原文链接
阅读:97 评论:0 查看评论