順序儲存完全二叉樹的基本操作
#include<stdio.h>
#include<malloc.h>
#define MAX_TREE_NODE_SIZE 100
typedef struct
{
int item[MAX_TREE_NODE_SIZE]; //根儲存在下標為1的陣列單元中,內容為結點的表示數字
int n; //當前完全二叉樹的結點個數
}QBTree;
QBTree *BT;
void CreateBTree(QBTree *BT,int data[],int n) //構造一棵完全二叉樹
{
if (n >= MAX_TREE_NODE_SIZE)
n = MAX_TREE_NODE_SIZE-1; //因為下標從1開始
for (int i = 1; i <= n;i++)
BT->item[i] = data[i];
BT->n=n;
}
int LeftChild_locate(QBTree BT,int node) //獲取給定結點(位置)的左孩子的結點位置
{
if (node > BT.n)
{
printf("該結點不存在!/n");
return 0;
}
else if ((2 * node) > BT.n)
return -1;
else
return 2 * node;
}
int LeftChild_value(QBTree BT,int node) //獲取給定結點(值)的左孩子的結點位置
{
int tmp = 0;
for (int i = 1;i <= BT.n;i++)
{
if (BT.item[i] == node)
{
tmp = i;
break;
}
}
if ((tmp != 0) && ((2 * tmp) <= BT.n))
{
return 2 * tmp;
}
else
return -1;
}
int RightChild_locate(QBTree BT,int node) //獲取給定結點(位置)的右孩子的結點位置
{
if ((2 * node + 1) > BT.n)
return -1;
else
return 2 * node + 1;
}
int RightChild_value(QBTree BT,int node) //獲取給定結點(值)的右孩子的結點位置
{
int tmp = 0;
for (int i = 1;i <= BT.n;i++)
{
if (BT.item[i] == node)
{
tmp = i;
break;
}
}
if ((tmp != 0) && ((2 * tmp + 1) <= BT.n))
{
return 2 * tmp + 1;
}
else
return -1;
}
int Parent(QBTree BT,int node) //獲取給定結點(位置)的父親
{
if ((1 < node) && (node <= BT.n)) //1結點沒有父結點
return node/2;
else
return -1;
}
bool IsEmpty(QBTree BT) //判斷二叉樹是否為空
{
if (BT.n == 0)
return true;
else
return false;
}
void ClearBTree(QBTree *BT) //清空以BT為根的二叉樹
{
BT->n = 0;
}
void layer_Traverse(QBTree BT) //遍歷,由於是順序儲存,直接順序遍歷就是按層次遍歷
{
for (int i = 1;i <= BT.n;i++)
{
printf("%d ",BT.item[i]);
if (i % 5 == 0)
printf("/n");
}
}
void forward_Traverse(QBTree BT,int i) //前序遞迴遍歷,先把左的遍歷完再回溯
{
if (!IsEmpty(BT))
{
printf("%d ",BT.item[i]); //對輸入的結點操作
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
forward_Traverse(BT,LeftChild_locate(BT,i));
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
forward_Traverse(BT,RightChild_locate(BT,i));
}
else
{
printf("該樹為空!/n");
}
}
void middle_Traverse(QBTree BT,int i) // 中序遞迴遍歷
{
if (!IsEmpty(BT))
{
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
middle_Traverse(BT,LeftChild_locate(BT,i));
printf("%d ",BT.item[i]); //對輸入的結點操作
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
middle_Traverse(BT,RightChild_locate(BT,i));
}
else
{
printf("該樹為空!/n");
}
}
void back_Traverse(QBTree BT,int i) //後序遞迴遍歷
{
if (!IsEmpty(BT))
{
if ((LeftChild_locate(BT,i)) != -1) //如果左子結點存在,遞迴
back_Traverse(BT,LeftChild_locate(BT,i));
if ((RightChild_locate(BT,i)) != -1) //如果右子結點存在,遞迴
back_Traverse(BT,RightChild_locate(BT,i));
printf("%d ",BT.item[i]); //對輸入的結點操作
}
else
{
printf("該樹為空!/n");
}
}
void main()
{
int data[6];
BT = (QBTree*)malloc(sizeof(QBTree));
for (int i = 1;i <= 5;i++)
{
scanf("%d",&data[i]);
}
CreateBTree(BT,data,5); //1 2 3 4 5
int lc = LeftChild_locate(*BT,2);
printf("%d/n",lc);
int rc = RightChild_locate(*BT,1);
printf("%d/n",rc);
layer_Traverse(*BT); //1 2 3 4 5
printf("/n");
forward_Traverse(*BT,1); //1 2 4 5 3
printf("/n");
back_Traverse(*BT,1); //4 5 2 3 1
printf("/n");
middle_Traverse(*BT,1); //4 2 5 1 3
}
相關推薦
順序儲存完全二叉樹的基本操作
#include<stdio.h>#include<malloc.h>#define MAX_TREE_NODE_SIZE 100typedef struct {int item[MAX_TREE_NODE_SIZE]; //根儲存在下標為1的陣列單元
二叉樹基本操作
arch 非遞歸 alt pro stack depth 隊列 步驟 read 廣度優先搜索 1、把根節點入隊列; 2、如果隊列非空,出隊,再依次將左子樹入隊、右子樹入隊; 3、重復步驟2,直到隊列為空。 void BreadFirstSearch(TreeNode *ro
順序儲存的二叉樹的最近的公共祖先問題 (25 分)
順序儲存的二叉樹的最近的公共祖先問題 (25 分) 層次生成二叉樹 設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。 輸入格式: 輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其
線索二叉樹和二叉樹基本操作的實現
2018-11-18-18:25:23 一:二叉樹 1.二叉樹的性質 ①:在二叉樹的第i層上至多有pow(2,i-1)個結點(i>=1)。 ②:深度為k的二叉樹至多有pow(2,k)-1個結點(k>=1)。 ③:對任何一顆二叉樹T,如果其終端結點的個數為n0,度為2的結點數為
【資料結構】二叉樹基本操作
文章目錄 BinaryTree.h BinaryTree.c Test.c 棧和佇列的相關函式: 棧:https://blog.csdn.net/weixin_41892460/article/details/82
C語言-二叉樹基本操作以及二叉搜尋樹基本操作
功能 二叉樹操作: 建立二叉樹 遍歷二叉樹(前序,中序,後續) 計算高度 計算結點數目 清空二叉樹 空樹判斷 二叉搜尋樹操作: 插入 最值(最大值,最小值) 刪除 程式碼 #include &l
浙大版《資料結構》習題4.5 順序儲存的二叉樹的最近的公共祖先問題 (25 分)
設順序儲存的二叉樹中有編號為i和j的兩個結點,請設計演算法求出它們最近的公共祖先結點的編號和值。 輸入格式: 輸入第1行給出正整數n(≤1000),即順序儲存的最大容量;第2行給出n個非負整數,其間以空格分隔。其中0代表二叉樹中的空結點(如果第1個結點為0,則
c++學習筆記—二叉樹基本操作的實現
用c++語言實現的二叉樹基本操作,包括二叉樹的建立、二叉樹的遍歷(包括前序、中序、後序遞迴和非遞迴演算法)、求二叉樹高度,計數葉子節點數、計數度為1的節點數等基本操作。 IDE:vs2013 具體實現程式碼如下: #include "stdafx.h" #include
超全C語言二叉樹基本操作及講解
今天刷LeetCode上的題的時候,做到了關於二叉樹的題,於是決定把這一塊的知識整理一下。1、二叉樹的定義二叉樹通常以結構體的形式定義,如下,結構體內容包括三部分:本節點所儲存的值、左孩子節點的指標、右孩子節點的指標。這裡需要注意,子節點必須使用指標,就像我們定義結構體連結串
實驗四 二叉樹基本操作的實現
實現鏈式儲存建立,遞迴先序 中序 後序遍歷,葉子結點數,數的結點總數,交換左右子樹 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int cnt; //結點宣告,資
二叉樹基本操作實現及總結(適合複習)
本文包含以下內容 1 ,二叉樹三種建立 前序遞迴 表示式非遞迴 孩子兄弟表示式非遞迴 2,遍歷 三種遍歷的遞迴與非遞迴實現(前中後序) 層次遍歷(普通二叉樹,孩子兄弟連結串列)
連結儲存轉為順序儲存(二叉樹)
1、題目: Problem Description 問題描述:設有一棵二叉樹,其節點值為字元型並假設各值互不相等,採用二叉連結串列儲存表示。現輸入其擴充套件二叉樹的前序遍歷序列,建立該二叉連
java由先根中根遍歷序列建立二叉樹,由標明空子樹建立二叉樹,有完全二叉樹順序儲存結構建立二叉鏈式儲存結構
//由先根和中根遍歷建立二叉樹 public class bitree{ public bitree(String preorder,String inorder,int preindex,int in
[C++11] 順序儲存的完全二叉樹構造樹形結構
我們知道,二叉樹有兩種基本的儲存方式:順序儲存方式和樹形儲存方式。在用程式碼實現之前,我們先來分析一下我們的思路: (1)分析 假定我們採用如下結構來順序儲存一棵二叉樹。 不難看出seq是一個動態
n個結點的完全二叉樹按順序存儲在一維數組中
完全二叉樹 pmo 一維數組 LG 結點 weibo 順序存儲 get VR 347jvo6rji換言指縣奧嫡勤願劣笨《http://weibo.com/p/230927987959983096209408》 ixtlati6zo敵諶瓷芬嗡梅哺遣杏新《http://wei
二叉樹基本概念(滿二叉樹、完全二叉樹,滿二叉樹,二叉樹的遍歷)
1. 二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。 性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)
【資料結構週週練】014 利用棧和非遞迴演算法求鏈式儲存的二叉樹是否為完全二叉樹
一、前言 首先,明天是個很重要的節日,以後我也會過這個節日,在這裡,提前祝所有程式猿們,猿猴節快樂,哦不,是1024程式設計師節快樂。 今天要給大家分享的演算法是判斷二叉樹是否為完全二叉樹,相信大家對完全二叉樹的概念並不陌生,如果是順序儲存就會很方便,那鏈式儲存怎麼判斷呢,我的做法是:若
完全二叉樹 陣列儲存 層次構造
對於完全二叉樹,如果將其中的元素按層次遍歷順序存放入一個一維陣列中:設陣列大小為n(節點數為n),節點標號(key)為陣列下標i,即0,1,2,3,4,,,那麼:1.完全二叉樹的高度為: ceil(log2(n+1))2.i = 0: 根節點,root,無父節點。 i >= 1: 父節點為 floor
軟考:資料結構基礎——建立順序完全二叉樹
首先是關於樹,二叉樹,完全二叉樹的一些知識 一、樹 (一)、基本概念 1. 度:一個節點的子樹的個數 &
假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——含具體實現工程
假設二叉樹中每個結點的值為單個字元, 設計一個演算法將一棵以二叉鏈方式儲存的二叉樹 b 轉換成對應的順序儲存結構 a。——李春葆資料結構第五版第七章,P246,第十題 思路解析: 解:設二叉樹的順序儲存結構型別為SqBTree,先將順序儲存結構a中所有元素置為‘#’(表示空結點)。將b轉