二叉樹是樹的一種,特點如下:
1.每個節點最多有兩顆子樹,節點的度最大為2
2.左右子樹次序不能顛倒
3.即使某乙個節點只有乙個子樹,也要區分。
二叉查詢樹:
1.左子樹上的所有節點值均小於根節點值
2.右子樹上的所有節點均不小於根節點的值
3.左右子樹也滿足以上兩個條件
有序陣列的優勢是可以使用二分法快速查詢,鍊錶的優勢在於資料的插入和刪除。二叉樹兼具兩則的優點於一身。
在這裡插入**片
typedef
struct node* p_node;
struct node
p_node;
二叉查詢樹的查詢實現:
在這裡插入**片
p_node search_tree
(p_node p,
int data)
if(p ==
null
)printf
("no find node\n");
return p;
}
在這裡插入**片
node_t *
insert_tree
(node_t *root,
int x)
else
if(x < root->val)
else
return root;
}
刪除結點
刪除結點分為幾種情況:
1.結點為葉子結點,p為葉子結點,則直接刪除該節點,並調整父節點指標
2.結點為單支結點,p的子樹和p的父節點直接相連,刪除p結點即可
3.結點的左右子樹均不為空,找到p的直接後繼結點(p結點右孩子的最左子孫),刪除最左子孫,並讓最左子孫的父親結點成為該節點右子樹的父親結點,將最左子孫的值賦給p結點
在這裡插入**片
intdelete_tree_node
(node_t *root,
int x)
else
if(x < p_node->val)
else}if
(p_node && p_node->lchild ==
null
&& p_node->rchild ==
null
)else
if(q->lchild == p_node)
else
}else
if(p_node &&
(p_node->lchild || p_node->rchild)
)else
else
if(q->lchild == p_node && p_node->rchild)
else
if(q->rchild == p_node && p_node->lchild)
else
free
(p_node);}
}else
p_node->val = s->val;
if(t == p_node)
else
free
(s);
}return find;
}
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...