樹-孩子兄弟表示法的實現
1.什麼是樹
樹狀圖是一種資料結構,它是由n(n>=1)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點: 每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只有一個父節點;除了根節點外,每個子節點可以分為多個不相交的子樹;圖解(靈魂畫師)
2.樹的相關知識
節點的度:一個節點含有的子樹的個數稱為該節點的度; 葉節點或終端節點:度為0的節點稱為葉節點; 非終端節點或分支節點:度不為0的節點; 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 兄弟節點:具有相同父節點的節點互稱為兄弟節點; 樹的度:一棵樹中,最大的節點的度稱為樹的度; 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推; 樹的高度或深度:樹中節點的最大層次; 堂兄弟節點:雙親在同一層的節點互為堂兄弟; 節點的祖先:從根到該節點所經分支上的所有節點; 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。 森林:由m(m>=0)棵互不相交的樹的集合稱為森林; 遍歷表達法有3種方法:先序遍歷、中序遍歷、後序遍歷 定義一棵樹的根結點層次為1,其他節點的層次是其父結點層次加1。一棵樹中所有結點的層次的最大值稱為這棵樹的深度。3.樹的實現
樹的實現主要有三個:
1.父節點表示法:該方法主要思路是,每個節點儲存父節點的位置,這樣就構成一棵樹
2.孩子連結串列示法:該方法的主要思路是,每個節點用陣列儲存孩子位置,不過這個表示法有個致命的缺陷,就是造成大量空間上的浪費,因為陣列最大的長度必定和最多的度相等,但是並不是每個子樹都有那麼多度,所以造成空間上的浪費;
3.兄弟孩子節點表示法:該方法主要思路是:每個節點儲存孩子,兄弟節點位置,本次就用這個表示法實現
下面程式碼只實現了新增功能,有空再補上其他功能,其他功能也是大同小異,至於為什麼有個flag變數,因為我覺得樹裡存在重複的變數,所以用flag來唯一標識一個樹
package Tree; /* * 樹的整體 * @author WLNSSS * @time 2017.12.22 * */ public class MyTree<T> { // 記錄根樹 private Node root; // 記錄節點數 private int nodeCount; // 記錄節點標識的位置 private int superFlag; public MyTree(T data) { //初始化,構造器先裝配一個根節點 root = new Node(data); } // 在指定位置新增節點 public void add(T data, int flag) { // 定位到指定的位置 Node point = getNodePost(flag); // 錯誤檢查,判斷是否是空,如果空丟擲異常 if (point == null) { throw new NullPointerException("沒有此元素"); } else { // 判斷孩子節點空或非空,然後進行不同的操作 if (point.getChlid() == null) { point.setChlid(new Node(data)); } if (point.getChlid() != null) { Node temp = point.getChlid(); Node newNode = new Node(data); newNode.setBrother(temp); point.setChlid(newNode); } // 元素標識+1 flag++; } } // 定位節點位置,找出該節點 public Node getNodePost(int flag) { // 呼叫另外一個複用方法實現 return getNodePost(flag, root); } // 定位節點位置,找出該節點 private Node getNodePost(int flag, Node ponit) { // 節點指標,先從root節點開始遞迴 Node point = root; // 當遞迴到一個元素的flag等於要查詢的flag則返回當前的指標 if (point.flag == flag) { return point; } // 若兄弟節點非空,則遞迴取出元素 if (point.getBrother() != null) { return getNodePost(flag, point.getBrother()); } // 若子節點非空,則遞迴取出元素 if (point.getChlid() != null) { return getNodePost(flag, ponit.getChlid()); } // 若沒找到則返回null return null; } /* * 樹的節點(內部類) */ private class Node { // 儲存的資料 T data; // 子節點位置 Node chlid; // 兄弟節點位置 Node brother; // 唯一標識該節點的變數 int flag; public T getData() { return data; } public void setData(T data) { this.data = data; } public Node getChlid() { return chlid; } public void setChlid(Node chlid) { this.chlid = chlid; } public Node getBrother() { return brother; } public void setBrother(Node brother) { this.brother = brother; } public Node(T data) { this(data, null, null,superFlag); } public Node(T data, Node chlid, Node brother,int flag) { this.data = data; this.chlid = chlid; this.brother = brother; this.flag = flag; } } public static void main(String[] args) { MyTree<Integer> myTree = new MyTree(12); myTree.add(1,0); myTree.add(2,0); System.out.println(myTree.root.chlid.brother.getData()); } }
相關推薦
樹-孩子兄弟表示法的實現
1.什麼是樹 樹狀圖是一種資料結構,它是由n(n>=1)個有限節點組成一個具有層次關係的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點: 每個節點有零個或多個子節點;沒有父節點的節點稱為根節點;每一個非根節點有且只
【資料結構週週練】016 利用遞迴演算法及孩子兄弟表示法建立樹、遍歷樹並求樹的深度
一、前言 從今天起,就給大家分享一些樹的程式碼啦,不僅僅是二叉樹,我們要弄明白,普通的樹用資料結構怎麼儲存,它有哪些操作,它可以實現哪些功能? 可能大家要問了,二叉樹不是還沒有寫完嗎,線索二叉樹呢?二叉排序樹呢?平衡二叉樹呢?大家不要急,我們通過二叉樹來入門樹的演算法及程式碼實現,然後學
樹的孩子表示法,樹的兄弟表示法,樹的儲存結構詳解,資料結構-樹的學習(2)
樹的儲存結構: 孩子表示法:把每個結點的孩子結點排列起來,以單鏈表作儲存結構,則n個結點有n個孩子連結串列,如果是葉子結點則此單鏈表為空。然後n個頭指標又組成一個線性表,採用順序儲存結構,存放進一個一維陣列中。 為此,設計兩種結點結構,一個是孩子連結串列的孩子結點 |
【資料結構週週練】017 利用遞迴演算法及孩子兄弟表示法建立森林、遍歷森林並求森林的葉子結點個數
一、前言 從昨天起,就給大家分享一些樹和森林的程式碼啦,昨天分享的是求樹的深度,今天要給大家分享的是森林的遍歷以及求葉子的個數。 對於森林,大家可以做這樣的理解,一個深度大於1,根節點子樹個數大於1的樹去掉根節點,就是森林。森林中每棵樹的根節點再建立一個共同的雙親結點,
C語言資料結構——孩子兄弟表示法
任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們設定兩個指標,分別指向該節點的第一個孩子和此結點的右兄弟。 其中data是資料域,firstchild為指標域
父親、兒子、兄弟表示法儲存多叉樹
兄弟表示法: #include<cstdio> #include<algorithm> using namespace std; int n,m,son[101][101],cnt[101],x,Fa[101],y,pre,lc[101],rc[101];
有根樹的表達_左子右兄弟表示法
這是<<挑戰程式設計競賽2>>上的一節, 介紹了用左子右兄弟的方法儲存一棵有根樹. 用遞迴的方法求出所有結點的深度, 複雜度為O(n) 或者是單獨求出一個結點的深度(遞迴或是
普通樹轉二叉樹:左兒子右兄弟表示法
這兩天在吃力地學DP的優化,被虐地不行不行的。搞個小插曲。 左兒子右兄弟,顧名思義,是一棵轉換後的樹,它是一棵二叉樹,一個節點的左子樹表示的是原樹中這個節點的子節點,一個節點的右子樹表示的是這
二叉樹的連結串列表示法實現
本程式實際上是構建了一顆二叉排序樹,程式最後輸出構建數的中序遍歷。 程式碼實現: #include <stdio.h> #include <stdlib.h> typede
(2)Java數據結構--二叉樹 -和排序算法實現
運行 至少 exceptio 子節點 註釋 heapsort borde 搜索樹 選擇排序 === 註釋:此人博客對很多個數據結構類都有講解-並加以實例 Java API —— ArrayList類 & Vector類 & Link
數據結構——樹的相關算法實現
std div 運行 data 左右子樹 blog etc 結構 post 二叉樹的基本算法 包括二叉樹的遍歷(先、中、後),二叉樹的層次,二叉樹的深度,二叉樹的葉子節點數計算。相關算法思想可以看書,這裏只是給出相關算法實現。 代碼實現 #include <stdio
二叉樹的儲存表示與實現(陳銳,葛麗萍跟我學資料結構整理)
1.二叉樹的順序儲存, 即用一維陣列按照從左到右,從上到下的順序依次儲存,分析計算可得每個節點的編號,類似於樹狀陣列。 適用於完全二叉樹。 儲存非完全二叉樹時,需要在一維陣列中將二叉樹不存在的結點位置空出,並用NULL填充。 2.二叉樹.的鏈式儲存 二叉樹的鏈式儲存結構 二叉
程式設計練習20180916_1給出樹的雙親表示法,求該樹的高度;2字元流:處理不定長輸入的情況_STL排序演算法
1.給出樹的雙親表示法,求該樹的高度 有一棵合法的樹(不一定是二叉樹),節點用數字表示,現給出所有節點的父子關係,求該樹的高度! 輸入包含若干行,每行2個數字,中間以空格隔開,第一個數字表示父親節點,第二個數字表示孩子節點的編號 0 1 0 2 1 3 1 4
[樹] 6.64 計算樹(雙親表示法)的深度
題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.64 【題目】6.64 對以雙親表表示的樹編寫計算樹的深度的演算法 【答案】 /*---------------- |6.64 求樹的深度| -
資料結構樹的雙親表示法
#include<iostream> #include<malloc.h> #include<stdlib.h> using namespace std; #define max 100 typedef char TElemType;
C語言資料結構——樹的雙親表示法
1、樹的雙親表示法: 2、/* bo6-4.c 樹的雙親表儲存(儲存結構由c6-4.h定義)的基本操作(14個) */ Status InitTree(PTree *T) { /* 操作結果: 構造空樹T */ (*T).n=0; r
樹的雙親表示法
由於樹中的每個結點都有唯一的一個雙親結點,所以可用一組連續的儲存空間(一維陣列)儲存樹中的各個結點,陣列中的一個元素表示樹中的一個結點,每個結點含兩個域,資料域存放結點本身資訊,雙親域指示本結點的雙親結點在陣列中位置。 C語言程式碼實現: #includ
二叉樹的儲存表示與實現
二叉樹的順序儲存 完全二叉樹的儲存可以按照從上到下,從左到右的順序依次儲存在一維陣列中。完全二叉樹的順序儲存如圖所示: 如果按照從上到下,從左到右的順序把非完全二叉樹
由某習題聯想到的二叉樹廣義表表示法求深度(C語言)
二叉樹求深度(C語言) 習題詳情及解法 二叉樹的深度求解 閱讀之前注意: 本文閱讀建議用時:31min 本文閱讀結構如下表: 專案 下屬專案 測試用例數量 習題詳情及解法 無 1 二叉樹的深度求解
機器學習之--決策樹遞歸算法實現
決策 def 產生 直接 asi split classlist 好的 EDA import numpy as np import math #產生數據的函數 def createdatabase(): dataSet = [[1,1,‘yes‘],