C語言二叉樹建立(一定看的懂)
阿新 • • 發佈:2018-11-11
先貼一個百度出來的二叉樹的圖
二叉樹 就是首先得有一個根節點.這個節點的入度為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;
}
未經允許,不得轉載