1. 程式人生 > >Java學習筆記之二叉樹的節點數、深度

Java學習筆記之二叉樹的節點數、深度

在上篇博文《Java學習筆記之建立二叉樹》後,我們現在來求增加二叉樹的節點數、二叉樹的深度的函式,以下程式碼中黃色背景是增加實現的程式碼,由於註釋較多,我用綠色字型將自己解讀的註解區分。

老樣子還是先註明這句話:【本文的程式碼請見原創http://blog.csdn.net/wuwenxiang91322/article/details/12231657】

我是結合他的程式碼一行行通過註釋解讀自己的理解,從中溫習java的語法結構及資料結構、演算法的思想。如有錯誤,望批評指正~

package tree;
import java.util.Stack;

/**
 * 二叉樹的鏈式儲存
 * @author WWX
 */


public class BinaryTree{
//二叉樹通常用樹結點結構儲存,有時也包含指向唯一父節點的指標
private TreeNode root = null;

//BinTree()該方法與類名字相同,所以是構造方法,被預設強制為void
public  BinaryTree(){
root = new TreeNode(1,"A");
}

/*建立二叉樹,樹由結點構成
* <pre>
*           A
*     B          C
*  D     E            F
*  </pre>
* @param root
* @author WWX
*/

public void createBinTree(TreeNode root){
TreeNode newNodeB = new TreeNode(2,"B");
TreeNode newNodeC = new TreeNode(3,"C");
TreeNode newNodeD = new TreeNode(4,"D");
TreeNode newNodeE = new TreeNode(5,"E");
TreeNode newNodeF = new TreeNode(6,"F");
root.leftChild = newNodeB;
root.rightChild = newNodeC;
root.leftChild.leftChild = newNodeD;
root.leftChild.rightChild = newNodeE;
root.rightChild.rightChild = newNodeF;

}

//節點個數

//二叉樹的遞迴思想,先定義根節點root

public int size(){
return size(root);
}

//二叉樹遞迴思想:定義根節點root後,再用subtree實現遞迴
private int size(TreeNode subtree){
if (subtree == null)
return 0;
else
{
return 1+size(subtree.leftChild)+size(subtree.rightChild);
}
}


//樹的高度
//二叉樹遞迴思想,先定義root

public int height(){
return height(root);

}

//二叉樹遞迴思想,定義root後,再用subtree實現遞迴
private int height(TreeNode subtree){
if (subtree == null)
return 0;
else {
int i = height(subtree.leftChild);
int j = height(subtree.rightChild);
return (i<j)?(j+1):(i+1);
//三目運算子知識,如果(i<j)是真的,則返回j+1,否則返回i+1
}

}


/**
* 二叉樹的節點資料結構
* @author WWX
*/

private class TreeNode{
private int key = 0; //key 為層序編碼
private String data = null; //data 為資料域
private boolean isVisted = false;

/*     樹的每一個節點的資料結構都是TreeNode型別,
createBinTree裡定義的root為TreeNode型別,所以左右孩子也為TreeNode型別,
加上二叉樹的遞迴思想,所以所有節點都是TreeNode型別
        */ 

private TreeNode leftChild = null;
private TreeNode rightChild = null;



/*TreeNode(int key,String data) 方法名與類名相同,所以為構造方法

 為什麼要用到this?
 因為在TreeNode()函式中需要該函式所屬類的當前物件

//這裡符合必須使用this的情況:
* 構造方法將外部傳入的引數賦值給類的成員變數
* 構造方法的形式引數名稱與類的成員變數名一致
*/

//構造方法的形式引數名稱與類的成員變數名一致

public TreeNode(int key,String data){

this.key = key;//構造方法將外部傳入的引數賦值給類的成員變數
this.data = null;
this.isVisted = false;
this.leftChild = null;
this.rightChild = null;

}
}


//測試
public static void main(String[] args) {
        BinaryTree bt = new BinaryTree();
        //TreeNode root = new TreeNode(0, "R"); 
        
      /*這裡方法裡需要bt.root是由於root變數在BinaryTree類裡定義的,

       *根據作用域定義,root只在BinaryTree類裡起作用,其它地方呼叫root,都需要  bt.root
       * 比如:如果寫成bt.createBinTree(root),就變成root就不屬於BinarTree類了
      */

        bt.createBinTree(bt.root);
        System.out.println("the size of the tree is " + bt.size());
       System.out.println("the height of the tree is " + bt.height());

        
    }
}
 

列印的結果如下:

the size of the tree is 6
the height of the tree is 3