1. 程式人生 > >淺談完全二叉樹遍歷的實現

淺談完全二叉樹遍歷的實現

首先,什麼是二叉樹

定義:是一種特殊的樹形結構,每個節點至多隻有兩顆子樹,並且子樹有左右之分,其次序不能隨意顛倒,是有序樹的一種。
  二叉樹是由一個根結點、兩棵互不相交的左子樹和右子樹組成。

那麼如何實現構造完全二叉樹,如何先序遍歷,中序遍歷,後序遍歷二叉樹

遍歷是要用到遞迴

如何實現遞迴在下面原始碼中實現

這是二叉樹類,裡面包含了二叉樹的先中後遍歷
package binaryTree;

import java.util.LinkedList;

/**
 * 這是二叉樹類
 * @author Administrator
 *
 */
public class MyTree {
    //私有成員鏈佇列
 private LinkedList<TreeNode> list;
 
 public MyTree(LinkedList<TreeNode> list) {
  this.list = list;
 }
    //先序遍歷
 public void preOrder(TreeNode root){
  if(root==null){
   return;
  }
  System.out.print(root.getObj()+" ");
  preOrder(root.getLeftNode());
  preOrder(root.getRightNode());

 }
 //中序遍歷
 public void centerOrder(TreeNode root){
  if(root==null){
   return;
  }
  centerOrder(root.getLeftNode());
  System.out.print(root.getObj()+" ");
  centerOrder(root.getRightNode());

 }
 //後序遍歷
 public void endOrder(TreeNode root){
  if(root==null){
   return;
  }
  endOrder(root.getLeftNode());
  endOrder(root.getRightNode());
  System.out.print(root.getObj()+" ");
 }
}

這是節點類和單向連結串列不同的是二叉樹的引用域有兩個

雙向連結串列和二叉樹的節點類基本一致

package binaryTree;
/**
 * 這是二叉樹的節點類
 * @author Administrator
 *
 */
public class TreeNode {
    //資料域
 private Object obj;
 //左子域
 private TreeNode leftNode;
 //右子域
 private TreeNode rightNode;
 public TreeNode(Object obj, TreeNode leftNode, TreeNode rightNode) {
  super();
  this.obj = obj;
  this.leftNode = leftNode;
  this.rightNode = rightNode;
 }

 public Object getObj() {
  return obj;
 }

 public void setObj(Object obj) {
  this.obj = obj;
 }

 public TreeNode getLeftNode() {
  return leftNode;
 }

 public void setLeftNode(TreeNode leftNode) {
  this.leftNode = leftNode;
 }

 public TreeNode getRightNode() {
  return rightNode;
 }

 public void setRightNode(TreeNode rightNode) {
  this.rightNode = rightNode;
 }
 
}

測試類用於測試二叉樹的各種遍歷

package binaryTree;
/**
 * 測試類
 * 主方法測試二叉樹
 */
import java.util.LinkedList;

public class Test {
       public static void main(String[] args) {
     //定義一個數組和一個鏈佇列用於構造二叉樹類
     int [] value ={1,2,3,4,5,6,7,8,9,10,11,12,13};
  LinkedList<TreeNode> list = new LinkedList<TreeNode>();
  TreeNode node;
  //把帶有資料域Node逐個加入到鏈佇列裡面
        for(int i=0;i<value.length;i++){
            node = new TreeNode(value[i],null,null);
            list.add(node);
        }
        //把完整的Node逐個加入到鏈佇列裡面去
        for(int i=0;i<value.length/2-1;i++){
         list.get(i).setLeftNode(list.get(2*i+1));
         list.get(i).setRightNode(list.get(2*i+2));
        }
        list.get(value.length/2-1).setLeftNode(list.get(2*(value.length/2-1)+1));
        if(value.length%2==1){
         list.get(value.length/2-1).setRightNode(list.get(2*(value.length/2-1)+2));
        }
        //根據構造方法構造二叉樹
        MyTree tree = new MyTree(list);
        TreeNode root = list.get(0);
        tree.preOrder(root);
  System.out.println();
        tree.centerOrder(root);
  System.out.println();
        tree.endOrder(root);
 }
}


package binaryTree;
/**
 * 測試類
 * 主方法測試二叉樹
 */
import java.util.LinkedList;

public class Test {
       public static void main(String[] args) {
     //定義一個數組和一個鏈佇列用於構造二叉樹類
     int [] value ={1,2,3,4,5,6,7,8,9,10,11,12,13};
  LinkedList<TreeNode> list = new LinkedList<TreeNode>();
  TreeNode node;
  //把帶有資料域Node逐個加入到鏈佇列裡面
        for(int i=0;i<value.length;i++){
            node = new TreeNode(value[i],null,null);
            list.add(node);
        }
        //把完整的Node逐個加入到鏈佇列裡面去
        for(int i=0;i<value.length/2-1;i++){
         list.get(i).setLeftNode(list.get(2*i+1));
         list.get(i).setRightNode(list.get(2*i+2));
        }
        list.get(value.length/2-1).setLeftNode(list.get(2*(value.length/2-1)+1));
        if(value.length%2==1){
         list.get(value.length/2-1).setRightNode(list.get(2*(value.length/2-1)+2));
        }
        //根據構造方法構造二叉樹
        MyTree tree = new MyTree(list);
        TreeNode root = list.get(0);
        tree.preOrder(root);
  System.out.println();
        tree.centerOrder(root);
  System.out.println();
        tree.endOrder(root);
 }
}