最近复习数据结构,自己将二叉树的常见问题写了一篇。部分代码参考了如下博文:
1.http://blog.csdn.net/fightforyourdream/article/details/16843303
2.http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
解决的常见问题为:
1. 求二叉树中的节点个数
2. 求二叉树的深度
3. 前序遍历,中序遍历,后序遍历
4. 分层遍历二叉树
5. 将二叉查找树变为有序的双向链表
6. 求二叉树第K层的节点个数
7. 求二叉树中叶子节点的个数
8. 求二叉树的镜像
9.由前序遍历序列和中序遍历序列重建二叉树
10.判断二叉树是不是完全二叉树
11.获取任意节点与根节点的路径
12. 求二叉树中两个节点的最低公共祖先节点
13.求二叉树的宽度
14.判断二叉树是否是AVL树(平衡二叉树)
源代码如下:
package edu.njupt.zhb;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
/*
*@author: ZhengHaibo
*web: http://blog.csdn.net/nuptboyzhb
*mail: zhb931706659@126.com
*2014-3-13 Nanjing,njupt,China
*/
/**
* 二叉树的实现
*/
public class MyBinaryTree {
/**
* 二叉树的节点
*/
public class TreeNode{
Object data;//数据区
TreeNode left;//左子树
TreeNode right;//右子树
}
public MyBinaryTree(){
}
/**
* 先序遍历的递归实现
* 根->左子树->右子树
* @param root
* @param list
*/
public void preOrderTraverse(TreeNode root,List list){
if(root==null){
return;
}
list.add(root.data);
preOrderTraverse(root.left, list);
preOrderTraverse(root.right, list);
}
/**
* 先序遍历的非递归实现,借助单栈
* @param root
* @param list
*/
public void preOrderLoop(TreeNode root,List list){
if(root==null){
return;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.data);
if(node.right!=null){//如果右子树不为空,入栈
stack.push(node.right);
}
if(node.left!=null){如果左子树不为空,入栈
stack.push(node.left);
}
}
}
/**
* 中序遍历的递归实现
* 左子树->根->右子树
* @param root
* @param list
*/
public void inOrderTraverse(TreeNode root,List list){
if(root==null){
return;
}
inOrderTraverse(root.left, list);
list.add(root.data);
inOrderTraverse(root.right, list);
}
/**
* 中序遍历的非递归实现(双栈)
* 左子树->根->右子树
* @param root
* @param list
*/
public void inOrderLoop(TreeNode root,List list){
if(root==null){
return ;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode pNode=root;
while(pNode!=null||!stack.isEmpty()){
while(pNode!=null){//一直将该节点的左子树入栈
stack.push(pNode);
pNode=pNode.left;
}
if(!stack.isEmpty()){
pNode=stack.pop();
list.add(pNode.data);
pNode=pNode.right;//转向右子树进行下一次循环