节点的定义:
Class BinaryTreeNode{
BinaryTreeNode leftchild;
BinaryTreeNode rightchild;
int val;
BinaryTreeNode(int newval){
leftchild=null;
rightchild=null;
val=newval;
}
##层次遍历
按层对树进行遍历
public void BinaryTreeLevelOrder(BinaryTreeNode node){
if(node==null){
return;
}
LinkedList<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
queue.add(node);
while(!queue.isEmpty()){
node = queue.poll();
System.out.println(node.val);
if(node.leftChild!=null){
queue.add(node.leftChild);
}
if(node.rightChild!=null){
queue.add(node.rightChild);
}
}
}
##先序遍历
首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,
仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。
- 递归
public void BinaryTreePreOrder(BinaryTreeNode node){
if(node==null){
return;
}
System.out.println(node.val);
BinaryTreePreOrder(node.leftChild);
BinaryTreePreOrder(node.rightChild);
}
- 非递归
public void BinaryTreeNonCyclePreOrder(BinaryTreeNode node){
Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
while(node!=null||!stack.empty()){
while(node!=null){
System.out.println(node.val);
stack.push(node);
node = node.leftChild;
}
if(!stack.empty()){
node = stack.pop();
node = node.rightChild;
}
}
}
##中序遍历
首先遍历左子树,然后访问根结点,最后遍历右子树。如果二叉树为空则返回。
- 递归
public void BinaryTreeInOrder(BinaryTreeNode node){
if(node==null){
return;
}
BinaryTreePreOrder(node.leftChild);
System.out.println(node.val);
BinaryTreePreOrder(node.rightChild);
}
- 非递归
public void BinaryTreeNonCycleInOrder(BinaryTreeNode node){
Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
while(node!=null || !stack.empty()){
while(node!=null){
stack.push(node);
node = node.leftChild;
}
if(!stack.empty()){
node = stack.pop();
System.out.println(node.val);
node = node.rightChild;
}
}
}
##后序遍历
首先遍历左子树,然后遍历右子,最后树访问根结点。如果二叉树为空则返回。
- 递归
public void BinaryTreePostOrder(BinaryTreeNode node){
if(node==null){
return;
}
BinaryTreePreOrder(node.leftChild);
BinaryTreePreOrder(node.rightChild);
System.out.println(node.val);
}
- 非递归
public void BinaryTreeNonCyclePostOrder(BinaryTreeNode node){
Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
TreeNode newNode =node;
while(node!=null){
while(node.leftChild!=null){
stack.push(node);
}
while(node!=null&&(node.rightChild==null||node.rightChild==newNode)){
System.out.println(node.val);
newNode =node;
if(stack.empty())
return;
node=stack.pop();
}
stack.push(node);
node=node.rightChild;
}
}