樹:二叉連結串列的實現
二叉連結串列介紹
二叉樹每個結點最多有2個孩子,所以為它設計一個數據域和2個指標域是比較自然的想法,我們稱這樣的連結串列叫做二叉連結串列。
二叉連結串列思路
二叉連結串列的資料結構,資料域,左右孩子指標域。每個樹結點都有左右孩子,如果沒有孩子那麼孩子指標域為NULL。我們用char型別的資料來模擬二叉連結串列的建立和遍歷。
我們知道二叉連結串列的遍歷有3種,前序遍歷,中序遍歷,後序遍歷。那麼建立連結串列的時候同樣我們可以約定是前序、中序還是後序的形式進行進建立樹結點。以下圖為例,我們使用前序遍歷的形式建立二叉連結串列,然後將用3種遍歷形式輸出。如圖按照前序遍歷的結果是:ABCDEG,中序遍歷結果:CBDAEG
二叉連結串列程式碼
#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.取棧頂結