1. 程式人生 > >樹-孩子兄弟表示法的實現

樹-孩子兄弟表示法的實現

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‘],