1. 程式人生 > >C語言二叉樹建立(一定看的懂)

C語言二叉樹建立(一定看的懂)

 

先貼一個百度出來的二叉樹的圖

二叉樹 就是首先得有一個根節點.這個節點的入度為0也就是它只有子節點沒有父節點 如1號節點

 

 

每個節點又有一個左兒子和一個右兒子 當然也可以沒有

接下來就是建立.建立一棵樹得現有這棵樹的結點和樹根

 

 

首先來宣告一個樹的結點

 

typedef struct node{ //樹的結點
	int data;
	struct node* left;
	struct node* right;
} Node;

 

當然 int data;這裡叫做資料域 也可以多寫一些.

然後就是樹根了

typedef struct { //樹根
	Node* root;
} Tree;

樹根建立完了然後就可以寫建立樹的函數了

 

void insert(Tree* tree, int value)//建立樹
{
    Node* node=(Node*)malloc(sizeof(Node));//建立一個節點
    node->data = value;
    node->left = NULL;
    node->right = NULL;
}

第一個引數是這個樹的樹根。想想我們的連結串列 如果頭插法的話是不是把頭傳到函式裡面就可以了

第二個節點是值 也就是 我們之前節點的data

第一行動態申請一個空間因為是malloc 出來的所以在堆記憶體中是有例項的

不會隨著函式結束而釋放

創建出來以後讓左兒子和右兒子為null 讓指標初始化的時候指向NULL是一個很好的習慣

然後結點創建出來就要把它連到樹裡面了。

如果這個樹是空樹我是不是可以讓樹根存下這個節點呢?

if (tree->root == NULL)//判斷樹是不是空樹
    {
        tree->root = node;
    }

如果不是空樹的話我們可以給一個約束條件

我們規定這個樹的父節點小於右兒子又大於左兒子 也就是

左兒子 < 父節點 < 右兒子。

我們先按照這樣去約束

所以再樹已經不是空樹的時候我們就可以從頭開始判斷

else {//不是空樹
        Node* temp = tree->root;//從樹根開始
        while (temp != NULL)
        {
         }

小於進左兒子 大於進右兒子

不管進了哪一邊我們無非就兩種情況有節點或者是NULL

是NULL我們直接讓新建的節點就放在這就可以了 然後返回對嗎

如果有節點呢?

那我們應該再判斷一遍,還是和之前一樣。

只要一和前面有重複的操作那我們架個迴圈跑就好了 對不對

void insert(Tree* tree, int value)//建立樹
{
    Node* node=(Node*)malloc(sizeof(Node));//建立一個節點
    node->data = value;
    node->left = NULL;
    node->right = NULL;
    if (tree->root == NULL)//判斷樹是不是空樹
    {
        tree->root = node;
    }
    else {//不是空樹
        Node* temp = tree->root;//從樹根開始
        while (temp != NULL)
        {


            if (value < temp->data)//小於就進左兒子
            {
                if (temp->left == NULL)
                {
                    temp->left = node;
                    return;
                }
                else {//繼續判斷
                    temp = temp->left;
                }
            }
            else {//否則進右兒子

                if (temp->right == NULL)
                {
                    temp->right = node;
                    return;
                }
                else {//繼續判斷
                    temp = temp->right;
                }
            }
        }
    }
    return;
}

 

好了 建立的函式結束了 

 

然後遍歷二叉樹 一般用中序遍歷

因為用中序遍歷可以從小到大去遍歷如果不懂的可以去查一下

好了來一發完整程式碼

#include <cstdlib>
#include <stdio.h>


typedef struct node{ //樹的結點
    int data;
    struct node* left;
    struct node* right;
} Node;

typedef struct { //樹根
    Node* root;
} Tree;

void insert(Tree* tree, int value)//建立樹
{
    Node* node=(Node*)malloc(sizeof(Node));//建立一個節點
    node->data = value;
    node->left = NULL;
    node->right = NULL;
    if (tree->root == NULL)//判斷樹是不是空樹
    {
        tree->root = node;
    }
    else {//不是空樹
        Node* temp = tree->root;//從樹根開始
        while (temp != NULL)
        {


            if (value < temp->data)//小於就進左兒子
            {
                if (temp->left == NULL)
                {
                    temp->left = node;
                    return;
                }
                else {//繼續判斷
                    temp = temp->left;
                }
            }
            else {//否則進右兒子

                if (temp->right == NULL)
                {
                    temp->right = node;
                    return;
                }
                else {//繼續判斷
                    temp = temp->right;
                }
            }
        }
    }
    return;
}

void inorder(Node* node)//樹的中序遍歷
{
    if (node != NULL)
    {
        inorder(node->left);
        printf("%d ",node->data);
        inorder(node->right);
    }
}

int main()
{
    Tree tree;
    tree.root = NULL;//建立一個空樹
    int n;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)//輸入n個數並建立這個樹
    {
        int temp;
        scanf("%d",&temp);
        insert(&tree, temp);
    }
    inorder(tree.root);//中序遍歷
    getchar(); getchar();
    return 0;
}

未經允許,不得轉載