1. 程式人生 > >樹:二叉連結串列的實現

樹:二叉連結串列的實現

二叉連結串列介紹

二叉樹每個結點最多有2個孩子,所以為它設計一個數據域和2個指標域是比較自然的想法,我們稱這樣的連結串列叫做二叉連結串列

二叉連結串列思路

二叉連結串列的資料結構,資料域,左右孩子指標域。每個樹結點都有左右孩子,如果沒有孩子那麼孩子指標域為NULL我們用char型別的資料來模擬二叉連結串列的建立和遍歷

我們知道二叉連結串列的遍歷有3種前序遍歷,中序遍歷,後序遍歷。那麼建立連結串列的時候同樣我們可以約定是前序、中序還是後序的形式進行進建立樹結點。以下圖為例,我們使用前序遍歷的形式建立二叉連結串列,然後將用3種遍歷形式輸出。如圖按照前序遍歷的結果是:ABCDEG,中序遍歷結果:CBDAEG

,後序遍歷結果:CDBGEA


二叉連結串列程式碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef char EleType;
typedef struct BiTNode
{
	EleType data;//資料結點資料域
	struct BiTNode	*lchild, *rchild;//左孩子,右孩子結點指標域
}BiTNode,*BiTree;

//約定通過前序遍歷建立結點
//每個結點都有左右孩子,孩子不存在為NULL
void CreatBiTree(BiTree* tree)
{
	char c;
	scanf("%c",&c);
	if (' '== c)
	{
		*tree = NULL;
	}
	else
	{
		*tree = (BiTNode*)malloc(sizeof(BiTNode));
		(*tree)->data = c;
		CreatBiTree(&(*tree)->lchild);//建立左子樹
		CreatBiTree(&(*tree)->rchild);//建立右子樹
	}
}
void visit(EleType data,int level)
{
	printf("%c 第%d層\n", data,level);
	return;
}

//前序遍歷
void PreOrderTraverse(BiTree tree,int level)
{
	if (NULL != tree)
	{
		visit(tree->data, level);
		PreOrderTraverse(tree->lchild, level + 1);
		PreOrderTraverse(tree->rchild, level + 1);
	}
}
//中序遍歷
void MidOrderTraverse(BiTree tree, int level)
{
	if (NULL != tree)
	{
		MidOrderTraverse(tree->lchild, level + 1);
		visit(tree->data, level);
		MidOrderTraverse(tree->rchild, level + 1);
	}
}
//後序遍歷
void PostOrderTraverse(BiTree tree, int level)
{
	if (NULL != tree)
	{
		PostOrderTraverse(tree->lchild, level + 1);
		PostOrderTraverse(tree->rchild, level + 1);
		visit(tree->data, level);
	}
}

int main(int argc, char *argv[])
{
	BiTree tree = NULL;
	printf("請按前序遍歷的方式輸入結點資料,沒有結點不存在請使用空格代替:");
	CreatBiTree(&tree);
	printf("前序遍歷:\n");
	PreOrderTraverse(tree, 1);
	printf("中序遍歷:\n");
	MidOrderTraverse(tree, 1);
	printf("後序遍歷:\n");
	PostOrderTraverse(tree, 1);

	return 0;
}

程式碼執行驗證

在建立二叉連結串列時,我們約定空格個位NULL孩子結點,我們以前序遍歷的形式建立二叉連結串列輸入應該是:ABC  D  E G  也就是ABC2個空格D2個空格E1個空格G2個空格換行


相關推薦

連結串列實現

二叉連結串列介紹二叉樹每個結點最多有2個孩子,所以為它設計一個數據域和2個指標域是比較自然的想法,我們稱這樣的連結串列叫做二叉連結串列。二叉連結串列思路二叉連結串列的資料結構,資料域,左右孩子指標域。每

連結串列的類模板實現

該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。 定義二叉樹節點類,採用二叉連結串列實現。 [cpp] view plaincopyprint? ///////////////////////// #incl

[資料結構]連結串列的類模板實現

該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。定義二叉樹節點類,採用二叉連結串列實現。///////////////////////// #include <iostream> #include <cstdlib> #include <

c語言實現連結串列)非遞迴後序遍歷

演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost

C++實現連結串列

#include "stdafx.h" #include <iostream> #include <deque> using namespace std; template<typename T> struct TreeNode{

連結串列儲存

節點形態: 實現: /****************************************** 二叉樹的二叉連結串列儲存 by Rowandjj 2014/5/18 ****************************************

採用連結串列儲存,複製的演算法(的應用)

二叉樹採用二叉連結串列儲存,試寫出複製一棵二叉樹的演算法。 話不多說上程式碼: #include<stdio.h> #include<stdlib.h> typedef struct BiTnode   {   &

[] △ 6.65 已經前序序列、中序序列 建立 連結串列

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.65 【題目】6.65 已知一棵二叉樹的前序序列和中序序列分別存於兩個一維陣列中,試編寫演算法建立該二叉樹的二叉連結串列。 【答案】 // 6.65

的儲存結構(連結串列(孩子—兄弟))

// c6-5.h 樹的二叉連結串列(孩子—兄弟)儲存結構(見圖6.32) typedef struct CSNode { TElemType data; CSNode *firstchild,*nextsibling; }CSNode,*CSTree; 一棵樹無論有

(1)建立二叉樹二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

NOJ-建立連結串列儲存結構-西工大資料結構

    今天上課講完二叉樹的第一節之後,回到宿舍就把二叉樹的第一道題做了。如有錯誤,請務必指正。    題目如下:    分析一下題目,就是用遞迴建立一個二叉樹,在按照先序遍歷輸出。這裡我採用的方法是每次讀入兩個資料,當第一個資料是字母,若第二個資料是‘(’,說明這個根有左支

連結串列儲存結構構建以及先序遍歷

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTyp

連結串列

</pre><pre name="code" class="cpp">#include <iostream> using namespace std; typedef char elemtype; int n=0; typedef str

C#實現--連結串列結構

1 /// <summary> 2 /// 二叉搜尋樹:結點的左子節點的值永遠小於該結點的值,而右子結點的值永遠大於該結點的值 稱為二叉搜尋樹 3 /// </summary> 4 public class LinkBinarySear

c語言實現的基本操作--連結串列儲存

利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>

資料結構 筆記-5 線索 以及 線索連結串列

線索二叉連結串列 線索二叉連結串列 來自於 二叉連結串列。一個二叉連結串列,如果存放n個結點,就一定有n+1個空指標域,而線上索鏈 表中,就讓這n+1個空指標域有了用武之地。 空指標域 用於存放 某種遍歷順序下的 前驅或者後繼的地址。   已知 一棵二叉樹的結構:

連結串列儲存的進行先序、中序和後序遍歷的演算法

用二叉樹連結串列作為儲存結構,完成二叉樹的建立,先序、中序和後序以及按層次遍歷的操作,求所有葉子及結點總數的操作 #include<iostream>   #include<cstdio>   #include<stdlib.h&

連結串列的儲存結構和基本操作(各種遍歷、求深度、求樹葉個數)

1.二叉樹的定義及性質 二叉樹是一種樹狀結構,它的特點是每個節點至多隻能有兩棵子樹,並且二叉樹的子樹有左右之分,其次序不能任意調換。 二叉樹具有以下重要性質: 性質 1 在二叉樹的第i層上至多有2^(i-1)個節點。 性質 2 深度為k的二叉樹至多有2^k-1個節點。 性

連結串列的方式建立一棵,並以非遞迴演算法中序輸出;計算的繁茂度,並判斷是否為完全

以二叉連結串列的方式存二叉樹,輸入時要以先序方式輸入,其中,空子樹用#表示。 二叉樹的繁茂度定義為其高度乘其每層結點最大值。演算法為先用遞迴演算法求二叉樹高度:其高度為左右子樹最大值加1,所以用先序遍歷,定義ld與rd分別為左右子樹高度,最後返回其較大值加1即可。二叉樹寬度

連結串列(鏈式)的非遞迴建立

這裡我採用的是先序非遞迴建立二叉樹。思路很簡單: 首先要有一個結點陣列。 1.取第一個結點,是否為空,不是就作為樹根,壓棧,是空則樹根為空,結束。 2.取下一個結點a。 3.取棧頂結