淺談完全二叉樹遍歷的實現
首先,什麼是二叉樹
定義:是一種特殊的樹形結構,每個節點至多隻有兩顆子樹,並且子樹有左右之分,其次序不能隨意顛倒,是有序樹的一種。
二叉樹是由一個根結點、兩棵互不相交的左子樹和右子樹組成。
那麼如何實現構造完全二叉樹,如何先序遍歷,中序遍歷,後序遍歷二叉樹
遍歷是要用到遞迴
如何實現遞迴在下面原始碼中實現
這是二叉樹類,裡面包含了二叉樹的先中後遍歷
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);
}
}