package mystudy;

import java.io.UnsupportedEncodingException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack; public class Tree { private TreeNode root; public Tree() { }; public Tree(TreeNode root) {
this.root = root;
} public void initTree() {
root = new TreeNode(8);
root.setLeft(new TreeNode(5));
root.getLeft().setLeft(new TreeNode(7));
root.getLeft().setRight(new TreeNode(4));
root.setRight(new TreeNode(9));
root.getRight().setRight(new TreeNode(6));
root.getRight().setLeft(new TreeNode(10));
} public void preOrderTraverse() {
preOrderTraverse(root);
} public void preOrderTraverse(TreeNode node) {
if (node != null) {
System.out.println(node.getValue());
preOrderTraverse(node.getLeft());
preOrderTraverse(node.getRight());
}
} public void nPreOrderTraverse() {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
System.out.println(node.getValue());
stack.push(node);
node = node.getLeft();
}
if (!stack.isEmpty()) {
node = stack.pop();
node = node.getRight();
}
}
} public void inOrderTraverse() {
inOrderTraverse(root);
} public void inOrderTraverse(TreeNode node) {
if (node != null) {
inOrderTraverse(node.getLeft());
System.out.println(node.getValue());
inOrderTraverse(node.getRight());
}
} public void nInOrderTraverse() {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.getLeft();
}
if (!stack.isEmpty()) {
node = stack.pop();
System.out.println(node.getValue());
node = node.getRight();
}
}
} public void postOrderTraverse() {
postOrderTraverse(root);
} public void postOrderTraverse(TreeNode node) {
if (node != null) {
postOrderTraverse(node.getLeft());
postOrderTraverse(node.getRight());
System.out.println(node.getValue());
}
} public void nPostOrderTraverse() {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
TreeNode preNode = null;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.getLeft();
}
if (!stack.isEmpty()) {
node = stack.peek();
if (node.getRight() == null || node.getRight() == preNode) {
node = stack.pop();
System.out.println(node.getValue());
preNode = node;
node = null;
} else {
node = node.getRight();
}
}
} } public void levelTraverse() {
levelTraverse(root);
} public void levelTraverse(TreeNode node) {
if (node != null) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(node);
while (!queue.isEmpty()) {
TreeNode mNode = queue.poll();
if (mNode != null) {
System.out.println(mNode.getValue());
if (mNode.getLeft() != null) {
queue.offer(mNode.getLeft());
}
if (mNode.getRight() != null) {
queue.offer(mNode.getRight());
}
}
}
}
} public int treeDepth() {
return treeDepth(root);
} public int treeDepth(TreeNode node) {
if (node == null) {
return 0;
}
int leftDepth = treeDepth(node.getLeft());
int rightDepth = treeDepth(node.getRight());
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
} public int minMaxSpan() {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if (root != null) {
int visitedNum = 0, addedNum = 1, levelNum = 1, min, max, depth = 0, minLevel = 0, maxLevel = 0;
min = max = root.getValue();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode mNode = queue.poll();
if (min > mNode.getValue()) {
min = mNode.getValue();
minLevel = depth;
} else if (max < mNode.getValue()) {
max = mNode.getValue();
maxLevel = depth;
}
visitedNum++;
if (mNode.getLeft() != null) {
queue.offer(mNode.getLeft());
addedNum++;
}
if (mNode.getRight() != null) {
queue.offer(mNode.getRight());
addedNum++;
}
if (visitedNum == levelNum) {
depth++;
levelNum = addedNum;
}
}
System.out.println("min:" + min + "max:" + max + "minLevel:"
+ minLevel + "maxLevel:" + maxLevel + "树的高度:" + depth);
return Math.abs(minLevel - maxLevel);
}
return -1;
} public class TreeNode {
private TreeNode left;
private TreeNode right;
private int value; public TreeNode(TreeNode left, TreeNode right, int value) {
this.left = left;
this.right = right;
this.value = value;
} public TreeNode(int value) {
this(null, null, value);
} public TreeNode getLeft() {
return left;
} public void setLeft(TreeNode left) {
this.left = left;
} public TreeNode getRight() {
return right;
} public void setRight(TreeNode right) {
this.right = right;
} public int getValue() {
return value;
} public void setValue(int value) {
this.value = value;
} } /**
* @param args
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
Tree tree = new Tree();
tree.initTree();
System.out.println("树中最大值最小值层数之差:" + tree.minMaxSpan());
System.out.println("前序递归:");
tree.preOrderTraverse();
System.out.println("前序非递归:");
tree.nPreOrderTraverse();
System.out.println("中序递归:");
tree.inOrderTraverse();
System.out.println("中序非递归:");
tree.nInOrderTraverse();
System.out.println("后序递归:");
tree.postOrderTraverse();
System.out.println("后序非递归:");
tree.nPostOrderTraverse();
System.out.println("按层次遍历:");
tree.levelTraverse();
System.out.println("树的高度:" + tree.treeDepth());
} }

最新文章

  1. Git学习(2)Git 安装
  2. unity工具IGamesTools之批量生成帧动画
  3. rhel5.5 Oracle10g安装记录
  4. Codeforces 220B - Little Elephant and Array 离线树状数组
  5. iOS UIView非常用方法及属性详解
  6. 【原】无脑操作:Windows 10 + MySQL 5.5 安装使用及免安装使用
  7. springboot~@Query到DTO对象
  8. C++ 死循环在语言层面的检测
  9. javascript 列表定时滚动效果
  10. github 的ssh key
  11. 初学Python的奇葩用法
  12. JavaSE学习总结(十)—— JDBC与面向对象测试
  13. Linux svn服务器搭建
  14. 解决validaform先验证后 ajax提交
  15. AS不能真机调试 (转)
  16. Linux 下移植QT(1)---tslib 1.4.0移植
  17. Android ListView中按钮监听器设置的解决方案
  18. Netty 源码中对 Redis 协议的实现
  19. C++builder XML XSL 代码生成
  20. 二十四种设计模式:迭代器模式(Iterator Pattern)

热门文章

  1. eclipse 远程debug
  2. Binder Native 层(二)
  3. Redis+Lua实现限流
  4. selenium自动化测试用例需要关注的几点(二)
  5. loadView 与 viewDidLoad 和 didReceiveMemoryWarning与viewDidUnload 详解
  6. JSP页面GET传值乱码问题
  7. CountDownLatch同步工具--控制多个线程执行顺序
  8. Linux定时增量更新文件--转
  9. Django settings.py添加静态文件夹
  10. python-爬虫之re模块