數據結構--樹

什麼是樹?java

樹是節點的有限集合node

名詞普及:算法

一、孩子:當前節點下的全部第一級節點,就是當前節點的孩子。數組

如上所示:post

A節點的孩子有B、C、D B節點的孩子有 D、E;spa

C節點沒有孩子 D節點的孩子有G、H指針

二、雙親節點(父節點):當前節點的上一級節點對象

如上所示:B是A的孩子,即B是A的雙親blog

三、祖先:從根到該節點所經分支上的全部節點;索引

如上所示:

E的祖先有:BAF的祖先有:BA

G的祖先有:DAH的祖先有:DA

B的祖先有:AC的祖先有:A

D的祖先有:A

4、兄弟節點:具備相同父節點的節點互稱爲兄弟節點;

如上所示:

BCD互爲兄弟節點;EF互爲兄弟節點; GH互爲兄弟節點;

5、堂兄弟節點:雙親在同一層的節點互爲堂兄弟;

如上所示:

EG互爲堂兄弟節點; EH互爲堂兄弟節點;

FG互爲堂兄弟節點; FH互爲堂兄弟節點;

 

六、度:當前節點下,孩子的數量就是該節點的度

如上所示:

A節點的度爲3;B節點的度爲2;C節點的度爲0;D節點的度爲2;EFGH的度爲0;

七、葉子(終端節點):沒有孩子的節點,即度爲0的節點就是終端節點

如上所示:

C、E、F、G、H爲終端節點;

八、根(非終端節點):有孩子的節點,即度不爲0的節點就是根

如上所示:

A、B、D爲終端節點;

九、有序樹:樹中任意節點的子結點之間有順序關係,這種樹稱爲有序樹;

十、無序樹:樹中任意節點的子結點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;

11、二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;

 

十二、深度:定義一棵樹的根結點層次爲1,其餘節點的層次是其父結點層次加1。一棵樹中全部結點的層次的最大值稱爲這棵樹的深度。

節點的深度:當前節點所在的層數

如上所示:A的深度爲1;B、C、D的深度爲2;E、F、G、H的深度爲3

樹的深度:取樹中全部節點深度最大的深度

如上所示:E的深度爲3,其餘全部節點的深度,沒有更大的,因此該樹的深度爲3‘

1三、森林:mm>=0)棵互不相交的樹(獨立的樹)的集合稱爲森林;

 

二叉樹

數組實現

數組與二叉樹之間的算法轉換:

父節點的下標 * 2 + 1 = 左子節點;

父節點的下標 * 2 + 2 = 右子節點;

鏈表實現

節點要素:索引,數據,左孩子指針,右孩子指針,父節點指針

前序遍歷:根、左、右

中序遍歷:左、根、右

後序遍歷:左、右、根

 

附上二叉樹的建立代碼:

package util;

import test.entity.TreeNode;

public class MyBinaryTree {
    private TreeNode myBinaryTree;
    
    /**
     * 初始化二叉樹
     */
    public MyBinaryTree () {
        myBinaryTree = new TreeNode();
    }
    
    /**
     * 搜索樹節點
     * @param nodeIndex
     * @return
     */
    public TreeNode SearchNode (int nodeIndex){
        return myBinaryTree.SearchNode(nodeIndex);
    }
    
    /**
     * 添加樹節點
     * @param nodeIndex
     * @param direction
     * @param treeNode
     * @return
     */
    public TreeNode addNode(int nodeIndex, int direction, TreeNode treeNode){
        TreeNode  node = SearchNode(nodeIndex);
        if (node == null){
            return null;
        }
        
        //若是直接使用外面傳進來的對象treeNode那麼當該對象在外面被進行操做時,可能會使該對象失去了所擁有的完整性,因此此處咱們新申請了一個對象用於存放treeNode的值
        TreeNode newNode = new TreeNode();
        newNode.index = treeNode.index;
        newNode.data = treeNode.data;
        
        if (direction == 0){
            node.pLChild = newNode;
        }

        if (direction == 1){
            node.pRChild = newNode;
        }
        newNode.pParent = node;
        return newNode;
    }
    
    /**
     * 刪除樹節點
     * @param nodeIndex
     * @return
     */
    public TreeNode deleteNode(int nodeIndex){
        TreeNode  node = SearchNode(nodeIndex);
        if (node == null){
            return null;
        }
        
        TreeNode temp = new TreeNode();
        temp.index = node.index;
        temp.data = node.data;
        
        node.deleteNode();
        return temp;
    }
    
    /**
     * 前序遍歷
     */
    public void preorderTraversal(){
        myBinaryTree.preorderTraversal();
    }

    /**
     * 中序遍歷
     */
    public void inorderTraversal(){
        myBinaryTree.inorderTraversal();
    }
    
    /**
     * 後序遍歷
     */
    public void postorderTraversal(){
        myBinaryTree.postorderTraversal();
    }
}
相關文章
相關標籤/搜索