二叉線索樹實現
直接上程式碼:
#include <cstdlib>
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct BSTree
{
ElemType data;
struct BSTree* left;
struct BSTree* right;
struct BSTree* parent;
}BSTRee,*BS_Tree;
void Insert_BSTree (BS_Tree *T,BS_Tree parent,ElemType e)
{
if((*T)==NULL)
{
BS_Tree temp=(BS_Tree)malloc(sizeof(BSTree));
temp->data=e;
temp->left=NULL;
temp->right=NULL;
temp->parent=parent;
*T=temp;
}
else
{
if((*T)->data==e)
{
return ;
}
else
{
if((*T)->data<e)
{
Insert_BSTree(&((*T)->right),*T,e);
}
else
Insert_BSTree(&((*T)->left),*T,e);
}
}
}
void Print_BSTree(BS_Tree T)
{
if(!T) return;
else
{
printf("%d ",T->data);
Print_BSTree(T->left);
Print_BSTree(T->right);
}
}
bool state=false;
bool Search(BS_Tree T,ElemType e)
{
if(T)
{
if(T->data==e)
{
printf("T->data=%d,e=%d\n",T->data,e);
state=true;
}
else
{
if(T->data<e)
Search(T->right,e);
else
Search(T->left,e);
}
}
// else
//{
return state;
//}
}
int Tree_Height(BS_Tree T)
{
if(!T)
return -1;
else
{
int left_height=Tree_Height(T->left);
int right_height=Tree_Height(T->right);
return ((left_height>right_height)?(left_height+1):(right_height+1));
}
}
int Tree_Node_Num(BS_Tree T)
{
static int num=0;
if(T)
{
num=num+1;
Tree_Node_Num(T->left);
Tree_Node_Num(T->right);
}
return num;
}
void Get_Parent_Node(BS_Tree T,ElemType e)
{
if(!T)
{
printf("parent node is null\n");
return ;
}
else
{
if(T->data==e)
{
if(T->parent)
{
printf("parent node is not null,data=%d\n",T->parent->data);
if(T->parent->data<e)
printf("right node data=%d\n",e);
else
printf("left node data=%d\n",e);
}
else
printf("parent node is null\n");
return ;
}
else
{
if(T->data<e) Get_Parent_Node(T->right,e);
else Get_Parent_Node(T->left,e);
}
}
}
void add_brackets(BS_Tree T)
{
if(T)
{
printf("%d[",T->data);
add_brackets(T->left);
printf(",");
add_brackets(T->right);
printf("]");
}
else
{
printf("#");
}
}
BS_Tree Tree_Minimum(BS_Tree x)
{
while(x->left)
x=x->left;
return x;
}
BS_Tree Tree_Maximum(BS_Tree x)
{
while(x->right)
x=x->right;
return x;
}
BS_Tree Tree_Successor(BS_Tree T)
{
if(T->right!=NULL)
{
return Tree_Minimum(T->right);
}
BS_Tree y=T->parent;
while(y!=NULL&&T==y->right)
{
T=y;
y=y->parent;
}
return y;
}
BS_Tree Tree_Predecessor(BS_Tree T)
{
if(T->left!=NULL)
{
return Tree_Maximum(T->left);
}
BS_Tree y=T->parent;
if(y!=NULL&&T==y->right)
{
return y;
}
else
return NULL;
}
void delete_element(BS_Tree *T,ElemType e)
{
//1. 不含有子節點
//2. 含有一個子節點
//3. 含有2個子節點
}
int main(int argc, char *argv[])
{
BS_Tree T=NULL;
int A[10]={4,1,5,2,6,8,3,7,10,9};
//int A[10]={2,4,4,4,4,4,4,4,5,4};
printf("start create BSTree\n");
for(int i=0;i<10;i++)
{
Insert_BSTree(&T,NULL,A[i]);
}
printf("finish create BSTree\n");
printf("start print!\n");
Print_BSTree(T);
printf("\nfinish print!\n");
printf("start search\n");
bool ret=Search(T,2);
if(ret) printf("search success\n");
else printf("search failed\n");
printf("Tree Height:\n");
int height=Tree_Height(T);
printf("%d\n",height);
printf("Finish Compute Tree Height:\n");
printf("Tree Node Num:\n");
int num=Tree_Node_Num(T);
printf("%d\n",num);
printf("Finish Compute Tree Node num\n");
printf("get parent node\n");
Get_Parent_Node(T,2);
printf("finish get parent node\n");
printf("add brackets\n");
add_brackets(T);
printf("\nfinish add brackets\n");
printf("start compute Predecessor:\n");
BS_Tree p=Tree_Predecessor(T->left);
if(p==NULL)
printf("NO Predecessor\n");
else
printf("Predecessor data is %d\n",p->data);
printf("start compute successor:\n");
p=Tree_Successor(T->right->right->right->right);
if(p==NULL)
printf("No successor\n");
else
printf("successor data is %d\n",p->data);
system("PAUSE");
return EXIT_SUCCESS;
}
相關文章
- 13、線索二叉樹二叉樹
- java實現-資料結構之二叉樹(三):線索化二叉樹Java資料結構二叉樹
- 【筆記】線索二叉樹筆記二叉樹
- 線索二叉樹的線索化演算法二叉樹演算法
- 二叉樹(順序儲存二叉樹,線索化二叉樹)二叉樹
- 線索二叉樹【定義、應用、線索化、遍歷】二叉樹
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 線索二叉樹的原理及建立二叉樹
- 實戰資料結構(12)_二叉樹的線索化資料結構二叉樹
- 線索二叉樹的構造和遍歷二叉樹
- 常用資料結構之線索二叉樹資料結構二叉樹
- 資料結構之線索化二叉樹資料結構二叉樹
- 線索二叉樹 Threaded BinaryTree二叉樹thread
- 【資料結構】二叉樹的線索化!!資料結構二叉樹
- 中序線索二叉樹的建立與遍歷二叉樹
- 論 如何畫線索二叉樹[資料結構]二叉樹資料結構
- 二叉樹實現二叉樹
- 中序線索二叉樹的構造和遍歷二叉樹
- 演算法線索二叉樹的建立和遍歷演算法二叉樹
- 輕鬆讓你徹底搞定c++版 線索二叉樹的線索化演算法C++二叉樹演算法
- 【資料結構&演算法】12-線索二叉樹資料結構演算法二叉樹
- 二叉樹java實現二叉樹Java
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 二叉排序樹的實現排序
- 霍夫曼樹(最優二叉樹)的實現二叉樹
- Java實現紅黑樹(平衡二叉樹)Java二叉樹
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- 二叉樹的遍歷實現二叉樹
- javascript實現二叉搜尋樹JavaScript
- iOS實現反轉二叉樹iOS二叉樹
- java語言實現二叉樹Java二叉樹
- 【練習】二叉樹的實現二叉樹
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 最優二叉樹(哈夫曼樹)Java實現二叉樹Java
- python實現非平衡二叉樹Python二叉樹
- 使用javascript實現排序二叉樹(2)JavaScript排序二叉樹
- 使用javascript實現排序二叉樹(1)JavaScript排序二叉樹
- 詳細二叉樹實現c++二叉樹C++