題目:
Invert a binary tree.
4
/ \
2 7
/ \ / \
1 3 6 9
to
4
/ \
7 2
/ \ / \
9 6 3 1
分析:
本題是對二叉樹的操作,題目要求將二叉樹反轉,可以有遞歸和非遞歸兩種實現方法,在編寫測試用例的時候,需要構建二叉樹和遍歷二叉樹,所以在代碼中一致列出。
代碼:
import java.util.LinkedList;
import java.util.Queue;
public class handleBinaryTree {
private TreeNode root;
/**
* 定義節點類
* @author Don
*
*/
public static class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){val=x;}
}
/**
* 構造函數
*/
public handleBinaryTree(){root=null;}
/**
* 構造二叉樹
*/
public void buildBinaryTree(TreeNode node,int val){
if(root==null){
root=new TreeNode(val);
}else{
if(val<node.val){
if(node.left==null){
node.left=new TreeNode(val);
}else{
buildBinaryTree(node.left,val);
}
}else{
if(node.right==null){
node.right=new TreeNode(val);
}else{
buildBinaryTree(node.right,val);
}
}
}
}
/**
* 先序遍歷
* @param node
*/
public void preOrder(TreeNode node){
if(node!=null){
System.out.print(node.val+".");
preOrder(node.left);
preOrder(node.right);
}
}
/**
* 中序遍歷
* @param node
*/
public void inOrder(TreeNode node){
if(node!=null){
inOrder(node.left);
System.out.print(node.val+".");
inOrder(node.right);
}
}
/**
* 後序遍歷
* @param node
*/
public void postOrder(TreeNode node){
if(node!=null){
postOrder(node.left);
postOrder(node.right);
System.out.print(node.val+".");
}
}
/**
* 層序遍歷
* @param node
*/
public void levelOrder(TreeNode node){
if(root==null) return;
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode temp=queue.poll();
System.out.print(temp.val+".");
if(temp.left!=null) queue.add(temp.left);
if(temp.right!=null) queue.add(temp.right);
}
}
/**
* 二叉樹反轉遞歸實現
* @param node
*/
public TreeNode invert(TreeNode node){
if(node==null) return null;
TreeNode left=node.left;
TreeNode right=node.right;
node.left=invert(right);
node.right=invert(left);
return node;
}
/**
* 二叉樹反轉非遞歸實現
* @param node
* @return
*/
public TreeNode invertqueue(TreeNode node){
if(node==null){
return null;
}
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(node);
if(!queue.isEmpty()){
TreeNode temp=queue.poll();
TreeNode left=node.left;
node.left=node.right;
node.right=left;
if(node.left!=null){
queue.offer(node.left);
}
if(node.right!=null){
queue.offer(node.right);
}
}
return node;
}
public static void main(String[] args){
int[] a={4,2,7,1,3,6,9};
handleBinaryTree tree=new handleBinaryTree();
for(int i=0;i<a.length;i++){
tree.buildBinaryTree(tree.root, a[i]);
}
tree.invertqueue(tree.root);
System.out.println("levelOrder:");
tree.levelOrder(tree.root);
}
}