數據結構4 - 樹與圖(非線性結構)


一、專業術語:

1. 節點	

2. 父節點	

3. 子節點

4. 子孫	

5. 堂兄弟、親兄弟

6. 深度:從根節點到最底層節點的層數,為深度。

7. 葉子節點:沒有子節點的節點就叫做葉子節點。

8. 非終端節點 == 非葉子節點

9. 度:子節點的個數。

二、樹的分類

2.1 一般樹

任意一個節點的子節點個數都不受限制。

2.2 二叉樹

任意一個節點的子節點最多兩個,且子節點樹不可更改。

分類:

1. 一般二叉樹

2. 滿二叉樹:在不增加層數的前提下,不能再增加一個節點的樹。

3. 完全二叉樹:如果只刪除了滿二叉樹的最底層最右邊連續的若干個(可以是0個)節點所形成的樹。

2.3 森林

n個互不相交的樹的集合。

三、樹存儲

1、二叉樹的存儲:

	1.1 連續存儲[完全二叉樹]
		優點:查找某個節點的父節點和子節點(也包括判斷有沒有子節點)的速度很快。
		缺點:非常耗內存。

	1.2 鏈式存儲
		三個指針域:parent,left,right。

2、一般樹存儲
	2.1 雙親表示法
	2.2 孩子表示法
	2.3 雙親孩子表示法
	2.4 二叉樹表示法:左指針域指向左邊的第一個孩子節點,右指針域指向親兄弟


3、森林存儲:也是轉換為二叉樹存儲。

四、二叉樹的操作

練習題

五、二叉樹先序遍歷程序

//
//  main.c
//  鏈式二叉樹
//
//  Created by zhengbing on 2017/5/3.
//  Copyright © 2017年 zhengbing. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>

struct TNode {
    char data;
    struct TNode * left;
    struct TNode * right;
};

struct TNode * creatNode(void); // 創建樹
void preTraverse(struct TNode * pRoot); // 先序遍歷

int main(int argc, const char * argv[]) {

    struct TNode * pRoot = creatNode();
    preTraverse(pRoot);
    return 0;
}

void preTraverse(struct TNode * pRoot){

    if (pRoot != NULL) {
        printf("%c \n", pRoot->data);
        preTraverse(pRoot->left);
        preTraverse(pRoot->right);
    }
}

struct TNode * creatNode(void){

    struct TNode *pA = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pB = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pC = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pD = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pE = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pF = (struct TNode *)malloc(sizeof(struct TNode));
    struct TNode *pG = (struct TNode *)malloc(sizeof(struct TNode));

    pA->data = 'A';
    pB->data = 'B';
    pC->data = 'C';
    pD->data = 'D';
    pE->data = 'E';
    pF->data = 'F';
    pG->data = 'G';

    pA->left = pB;
    pA->right = pC;

    pB->left = pD;
    pB->right = pF;

    pC->left = pC->right = NULL;

    pD->left = NULL;
    pD->right = pE;

    pE->left = pE->right = NULL;

    pF->left = pG;
    pF->right = NULL;

    pG->left = pG->right = NULL;

    return pA;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM