基本概念
树的定义:树是一种典型的非线性结构。树结构是表达具有层次特性的图结构的一种方法。元素的顺序不是考虑的重点,若需要用到元素顺序信息,可以使用链表、栈、队列等线性数据结构。 结点的深度:是指从根节点到该结点 的路径长度。 结点的高度:是指从该结点到最深结点 的路径长度 树的高度:是树中所有结点高度的最大值(树的深度同理) 其余的基本概念不表。
二叉树
类型:严格二叉树,满二叉树,完全二叉树 结构:假定结点数据为整数,两个指向左右孩子的指针。
public class BinaryTreeNode {
private int data;
private BinaryTreeNode left;
private BinaryTreeNode right;
public Object getters(){
// to be implemented
return null;
}
public void setters(){
// to be implemented
}
}
二叉树遍历:D为结点,L为D的左孩子结点,R为D的右孩子结点; 前序遍历:DLR
/**
* 递归版本前序遍历
* @param root
*/
void preOrder(BinaryTreeNode root){
if(root!=null){
System.out.println(root.getData());
preOrder(root.left);
preOrder(root.right);
}
}
/**
* 循环版本前序遍历
* @param root
*/
void preOrderNonRecursive(BinaryTreeNode root){
if(root==null) return;
Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
while(true){
while(root!=null){
System.out.println(root.getData());
stack.push(root);
root = root.getLeft();
}
if(stack.isEmpty()) break;
root = (BinaryTreeNode) stack.pop();
root = root.getRight();
}
}
中序遍历:LDR/**
* 递归版本中序遍历
* @param root
*/
void inOrder(BinaryTreeNode root){
if(root!=null){
inOrder(root.getLeft());
System.out.println(root.getData());
inOrder(root.getRight());
}
}
/**
* 循环版本中序遍历
* @param root
*/
void inOrderNonRecursive(BinaryTreeNode root){
if(root==null) return;
Stack<BinaryTreeNode> stack = new Stack<>();
while(true){
while(root!=null){
stack.push(root);
root = root.getLeft();
}
if(stack.empty()) break;
root = (BinaryTreeNode) stack.pop();
System.out.println(root.getData());
root = root.getRight();
}
}
后序遍历:LRD /**
* 递归版本后序遍历
* @param root
*/
void postOrder(BinaryTreeNode root){
if(root!=null){
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.println(root.getData());
}
}
/**
* 循环版本后序遍历,注意每个结点访问两次,检验是否有右子树
* @param root
*/
void postOrderNonRecursive(BinaryTreeNode root){
if(root==null) return;
Stack<BinaryTreeNode> stack = new Stack<>();
while(true){
if(root!=null){
stack.push(root);
root = root.getLeft();
}else{
if(stack.isEmpty()){
System.out.println("Stack is empty");
return;
}
else if(stack.peek().getRight()==null){
root = stack.pop();
System.out.println(root.getData());
if(root==stack.peek().getRight()){
System.out.println(stack.peek().getData());
stack.pop();
}
}
if(stack.isEmpty()) root = stack.peek().getRight();
else root = null;
}
}
}