1. 程式人生 > >二叉樹的定義和Java實現

二叉樹的定義和Java實現

先放上資料結構中有關樹的一些定義:

  1. 節點:節點包括一個數據元素及若干指向其子樹的分支

  2. 節點的度:節點所擁有的子樹的個數成為該節點的度

  3. 葉節點:度為0的節點稱為葉結點

  4. 分支節點:度不為0的節點稱為分支節點

  5. 樹的度:樹中所有節點的度的最大值

  6. 二叉樹:是n(n>=0)個有限節點構成的集合。n=0的樹稱為空二叉樹;n=1的樹只有一個根結點;
    n>1的二叉樹由一個根節點和至多兩個互不相交的,分別稱為左子樹和右子樹的子二叉樹構成
    二叉樹不是有序樹,這是因為,二叉樹中某個節點即使只有一個子樹也要區分是左子樹還是右子樹;
    而對於有序樹來說,如果某個節點只有一個子樹就必定是第一個子樹

  7. 二叉樹所有結點的形態有5種

    :空節點,無左右子樹節點,只有左子樹節點,只有右子樹節點和左右子樹均存在的節點

  8. 滿二叉樹:在一棵二叉樹中,如果所有分支節點都存在左子樹和右子樹,並且所有葉子節點都在同一層,則這樣的二叉樹稱作滿二叉樹
  9. 完全二叉樹:如果一顆具有n個節點的二叉樹的結構與滿二叉樹的前n個節點的結構相同,這樣的二叉樹稱為完全二叉樹
  10. 二叉樹的性質

1)若規定根節點的層數為0,則一棵非空二叉樹的第i層上最多有2^i(i>=0)個節點
2)若規定只有根節點的二叉樹的深度為0,則深度為k的二叉樹的最大節點數是2^(k+1)-1(k>=-1)
3)對於一棵非空的二叉樹,如果葉節點個數為n0,度為2的節點個數為n2,則有n0=n2+1
4)具有n個節點的完全二叉樹的深度k為大於或等於ln(n+1)-1的最小整數
5)對於具有n個節點的完全二叉樹,如果按照從上至下和從左至右的順序對所有節點序號從0開始順序編號,則對於序號為i(0<=i< n)的節點有:
如果i>0,則序號為i節點的雙親節點的序號為(i-1)/2(/為整除);如果i=0,則序號為i節點為根節點,無雙親節點 如果2i+1<
n,則序號為i節點的左孩子節點的序號為2i+1;如果2i+1>=n,則序號為i節點無左孩子 如果2i+2<
n,則序號為i節點的右孩子節點的序號為2i+2;如果2i+2>=n,則序號為i節點無右孩子

11.二叉樹的儲存結構

1.二叉樹的順序儲存結構 利用性質5,對於完全二叉樹可以利用一維陣列儲存,如果不是完全二叉樹,則可以補空節點,使成為完全二叉樹在進行儲存,
但是對於非完全二叉樹,可能要浪費很多的空間。
2.二叉樹的鏈式儲存結構 二叉樹的鏈式儲存結構就是用指標建立二叉樹中節點之間的關係,二叉樹最常用的鏈式儲存結構是二叉鏈。二叉樹的二叉鏈儲存結構是一種常用的
二叉樹儲存結構。二叉鏈存儲存結構的優點時,結構簡單,可以方便的構造任何形狀的二叉樹,並可以方便的實現二叉樹的大多數操作。
二叉鏈儲存結構的缺點是,查詢當前節點的雙親節點操作實現比較麻煩
3.二叉樹的模擬指標儲存結構 利用一維陣列和結構體實現,利用陣列的下標進行模擬指標進行二叉樹的操作

下面為具體程式碼實現:

package tree;

import java.util.LinkedList;
import java.util.List;
/** 
 *  
 * @author [email protected] @date: 2017-3-7 
 *  
 */  
public class BinTreeTraverse {
    private int arr[]={1,2,3,4,5,6,7};
    private static List<Node> nodeList=null;
    private static class Node{
        Node leftchild;
        Node rightchild;
        int data;
        Node(int newdata){
            leftchild=null;
            rightchild=null;
            data=newdata;
        }

    }
    public void createBintree(){//新建一個二叉樹
        nodeList=new LinkedList<Node>();
        for (int nodIndex = 0; nodIndex < arr.length; nodIndex++) {
            nodeList.add(new Node(arr[nodIndex]));
        }
        //以下定義主要依據上面講解的第五條的特性實現
        for (int parentIndex = 0; parentIndex < arr.length/2-1; parentIndex++) {
            //左孩子
            nodeList.get(parentIndex).leftchild=nodeList.get(parentIndex*2+1);
            //右孩子
            nodeList.get(parentIndex).rightchild=nodeList.get(parentIndex*2+2);
        }
        //最後一個父節點,因為最後一個父節點可能沒有右孩子,所以單獨拿出來處理
        int lastParentIndex=arr.length/2-1;
        //左孩子
        nodeList.get(lastParentIndex).leftchild=nodeList.get(lastParentIndex*2+1);
        if (arr.length%2==1) {
            nodeList.get(lastParentIndex).rightchild=nodeList.get(lastParentIndex*2+2);
        }
    }
     /** 
     * 先序遍歷 
     *  
     * 這三種不同的遍歷結構都是一樣的,只是先後順序不一樣而已 
     *  
     * @param node 
     * 遍歷的節點 
     */  
    public static void preOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        System.out.print(node.data + " ");  
        preOrderTraverse(node.leftchild);  
        preOrderTraverse(node.rightchild);  
    }  

    /** 
     * 中序遍歷 
     *  
     * 這三種不同的遍歷結構都是一樣的,只是先後順序不一樣而已 
     *  
     * @param node 
     *            遍歷的節點 
     */  
    public static void inOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        inOrderTraverse(node.leftchild);  
        System.out.print(node.data + " ");  
        inOrderTraverse(node.rightchild);  
    }  

    /** 
     * 後序遍歷 
     *  
     * 這三種不同的遍歷結構都是一樣的,只是先後順序不一樣而已 
     *  
     * @param node 
     *            遍歷的節點 
     */  
    public static void postOrderTraverse(Node node) {  
        if (node == null)  
            return;  
        postOrderTraverse(node.leftchild);  
        postOrderTraverse(node.rightchild);  
        System.out.print(node.data + " ");  
    }  

    public static void main(String[] args) {  
        BinTreeTraverse binTree = new BinTreeTraverse();  
        binTree.createBintree();  
        // nodeList中第0個索引處的值即為根節點  
        Node root = nodeList.get(0);  

        System.out.println("先序遍歷:");  
        preOrderTraverse(root);  
        System.out.println();  

        System.out.println("中序遍歷:");  
        inOrderTraverse(root);  
        System.out.println();  

        System.out.println("後序遍歷:");  
        postOrderTraverse(root);  
    }  

}

輸出的結果為:

先序遍歷:
1 2 4 5 3 6 7 
中序遍歷:
4 2 5 1 6 3 7 
後序遍歷:
4 5 2 6 7 3 1 

相關推薦

劍指Offer - 的深度(Java實現)

題目描述: 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路分析: 方法1:遞迴的思想解決問題。 public class Solution { public int TreeDe

列印所有路徑---JAVA實現

思路:把當前結點儲存到陣列當中,如果當前結點為葉子結點就列印當前陣列,採取遞迴的方式來進行操作。 技巧一:就是陣列的問題,所有路徑結點都存到一個數組當中,由於陣列傳遞是傳址,改變陣列指向內容的時候其他

劍指offer--面試題19:的映象--Java實現

題目描述: 請完成一個函式,輸入一個二叉樹,該函式輸出它的映象。 解題思路: 我們先前序遍歷這棵樹的每個結點,如果這個結點有子結點,就交換它的兩個子結點。當交換完所有非葉子結點的左右子結點後,就得到了樹的映象。 這裡採用了遞迴方式和非遞迴方式。

資料結構之(三)——定義性質

二叉樹(Binary Tree)是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個根結點和倆棵互不相交的,分別稱為根結點的左子樹和右子樹的二叉樹組成。 如圖: 二叉樹的特點 二叉樹的特點: 1.每個結點最多有倆棵子樹,所以二叉樹中不存在度

的深度java實現

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路:採用遞迴遍歷的方法,每深入一層,層數加一,最後一層所指向的nul

定義Java實現

先放上資料結構中有關樹的一些定義: 節點:節點包括一個數據元素及若干指向其子樹的分支 節點的度:節點所擁有的子樹的個數成為該節點的度 葉節點:度為0的節點稱為葉結點 分支節點:度不為0的節點稱為分支節點 樹的度:樹中所有節點的度的最大值 二叉樹:是n(n&g

定義及相關術語、節點數計算公式、程式碼實現(遍歷,Java版)

二叉樹 定義:二叉樹是由n(n>=0)個節點組成的有限集,或者為空樹(n=0),或者為由一個根節點和兩個分別稱為左子樹和右子樹的的互不相交的二叉樹構成。 特點:(1).每個節點最多能有兩棵子樹,即左子樹和右子樹。              (2).左子樹和右子樹有次序

Java 實現插入遍歷

定義節點類 package com.drj.tree; /** * * @ClassName: TreeNode * @Description:TODO(代表樹節點) * @author: drj * @date: 2018年8月22日

線索基本操作的實現

2018-11-18-18:25:23 一:二叉樹 1.二叉樹的性質   ①:在二叉樹的第i層上至多有pow(2,i-1)個結點(i>=1)。   ②:深度為k的二叉樹至多有pow(2,k)-1個結點(k>=1)。   ③:對任何一顆二叉樹T,如果其終端結點的個數為n0,度為2的結點數為

插入刪除操作的遞迴實現(c語言)

連結串列和陣列是最常見的資料結構,對於資料結構來說,查詢(Find),最大最小值(FindMin,FindMax),插入(Insert)和刪除(Delete)操作是最基本的操作。對於連結串列和陣列來說,這些操作的時間界為O(N),其中N為元素的個數。陣列的插入和刪除需要對其他

的高度 java 利用遞迴層次遍歷兩種方法

原文:http://blog.csdn.net/fangchao3652/article/details/53456468 ackage edu.lnu.fang.BiTree; import java.util.ArrayList; import java.util.L

的遍歷實現

size 非遞歸算法 沒有 con nod order reorder 實現 traverse 二叉樹的先序遍歷//先序遍歷二叉樹的遞歸實現 void PreOrderTraverse(BiTree T) { if(T) { printf("%2c",T->

建立遍歷

mil inorder 推斷 microsoft con 是否 font pac node 二叉樹創建遍歷規則: 1.先序:根-左-右 2.中序:左-根-右 3.後序:左-右-根 二叉樹定義和輔助函數例如以下: struct node {

[NOIp]的指針實現

++ main pan code while malloc 技巧 root left 今天學到了二叉樹,一開始被那個malloc弄的很迷,後來發現root=(BiTreeNode*)malloc(sizeof(BiTreeNode))的那個星號是在後面的,吐血。。 代碼裏

的代碼實現

數據結構 二叉樹 二叉樹是一種非線性的結構,但是在計算機中存儲時,卻要按照線性來存儲。二叉樹也是由一個一個結點構成,只不過是,一個結點中既要存放數據,又要存放左孩子的指針和右孩子的指針。所以,我們想要實現二叉樹,首先就得有一個二叉樹的結構,根據剛才的分析,那麽二叉樹結構中的變量應該要有三個。代碼

——定義

color 二叉 來源 col tree round 描述 目錄 樹和二叉樹 樹形結構是一類重要的非線性結構數據結構。其中以樹和二叉樹最為常用,直觀看來,樹是以分支關系定義的層次結構。 樹的定義與基本術語   樹的結構定義是一個遞歸定義,即在樹的定義中又用到樹的概念。除了樹

線索的C語言實現

null 字符 traverse 結點 表示 flow thread 當前 nil #include "string.h"#include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.

搜索應用——簡單字典實現

數據結構 搜索二叉樹 字典實現 搜索二叉樹基本概念請看上篇博客這兩個問題都是典型的K(key)V(value)問題,我們用KV算法解決。 判斷一個單詞是否拼寫正確:假設把所有單詞都按照搜索樹的性質插入到搜索二叉樹中,我們判斷一個單詞拼寫是否正確就是在樹中查找該單詞是否存在(查找key是否存在)。

112. Path Sum路徑

aps exist display splay term post ase urn 數據結構 [抄題]: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such th

非遞迴實現

二叉樹非遞迴實現會比較難理解一點,不過只要理解了非遞迴的,那麼遞迴的就非常好理解了。接下來進行圖文詳解。 C程式碼下載 C++程式碼下載 java程式碼下載 ( 備用地址下載) 導航 1.建立二叉樹 2.前序遍歷二叉樹 3.中序遍歷二叉樹 4.後序遍歷二叉