package zz;
import java.util.Stack;
/**
* 二叉树中的二叉搜索树,即一个节点的左子节点关键值小于这个节点,右子节点的关键值大于这个节点
*
* @author Administrator
*
*/
class TreeNode {
int value;
TreeNode leftChild;
TreeNode rightChild;
public TreeNode(int value) {
this.value = value;
this.leftChild = null;
this.rightChild = null;
}
}
public class Test {
// 求二叉树的深度
public static int getTreeLength(TreeNode root) {
if (root == null)
return 0;
if (root.leftChild == null && root.rightChild == null)
return 1;
else
return 1 + Math.max(getTreeLength(root.leftChild), getTreeLength(root.rightChild));
}
// 插入子节点
public static void insert(TreeNode root, int data) {
TreeNode newNode = new TreeNode(data);
if (root == null) {
root = newNode;
root.leftChild = null;
root.rightChild = null;
} else {
TreeNode cur = root;
TreeNode parent;
while (true) {
parent = cur;
if (data <= cur.value) {
cur = cur.leftChild;
if (cur == null) {
parent.leftChild = newNode;
return;
}
} else {
cur = cur.rightChild;
if (cur == null) {
parent.rightChild = newNode;
return;
}
}
}
}
}
// 查找二叉搜索树中的某个节点
public static TreeNode find(TreeNode root, int data) {
TreeNode cur = root;
while (data != cur.value) {
if (data > cur.value) {
cur = cur.rightChild;
} else {
cur = cur.leftChild;
}
if (cur == null)
return null;
}
return cur;
}
// 先序遍历(递归实现):先访问根节点,再访问左子节点,最后访问右孩子节点
public static void recPreOrder(TreeNode root) {
if (root == null)
return;
System.out.print(root.value + ",");
if (root.leftChild != null)
recPreOrder(root.leftChild);
if (root.rightChild != null)
recPreOrder(root.rightChild);
}
// 先序遍历(栈实现):先访问根节点,再访问左子节点,最后访问右孩子节点
public static void PreOrder(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stacks = new Stack<TreeNode>();
TreeNode node = root;
while (node != null || stacks.size() > 0) {
while (node != null) {
System.out.print(node.value + " ");
stacks.push(node);
node = node.leftChild;
}
if (stacks.size() > 0) {
node = stacks.pop();
//System.out.print(node.value + ",");
node = node.rightChild;
}
}
}
// 中序遍历(递归实现):先访问左子节点,再访问根节点,最后访问右子节点
public static void recInOrder(TreeNode root) {
if (root == null)
return;
if (root.leftChild != null)
recInOrder(root.leftChild);
System.out.print(root.value + ",");
if (root.rightChild != null)
recInOrder(root.rightChild);
}
//中序遍历(栈实现):先访问左子节点,再访问根节点,最后访问右子节点
public static void InOrder(TreeNode root) {
if(root == null) return;
Stack<TreeNode> stacks = new Stack<TreeNode>();
TreeNode node = root;
while(node != null || stacks.size() > 0) {
while(node != null) {
stacks.push(node);
node = node.leftChild;
}
if(!stacks.isEmpty()) {
node = stacks.pop();
System.out.print(node.value + " ");
node = node.rightChild;
}
}
}
// 后序遍历(递归实现):先访问左子节点,再访问右子节点,最后访问根节点
public static void recPostOrder(TreeNode root) {
if (root == null)
return;
if (root.leftChild != null)
recInOrder(root.leftChild);
if (root.rightChild != null)
recInOrder(root.rightChild);
System.out.print(root.value + ",");
}
// 后序遍历(栈实现):先访问左子节点,再访问右子节点,最后访问根节点
public static void PostOrder(TreeNode root) {
if(root == null)
return;
Stack<TreeNode> stacks = new Stack<TreeNode>();
TreeNode node = root;
TreeNode preNode = null;
while(node != null || !stacks.isEmpty()) {
while(node != null) {
stacks.push(node);
node = node.leftChild;
}
node = stacks.peek();
if(node.rightChild == null || node.rightChild == preNode) {
System.out.print(node.value + " ");
node = stacks.pop();
preNode = node;
node = null;
} else {
node = node.rightChild;
}
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(4);
insert(root, 2);
insert(root, 6);
insert(root, 1);
insert(root, 3);
insert(root, 5);
insert(root, 7);
insert(root, 8);
System.out.println("非递归先序遍历树:");
PreOrder(root);
System.out.println();
System.out.println("非递归中序遍历树");
InOrder(root);
System.out.println();
System.out.println("非递归后序遍历树");
PostOrder(root);
}
}