二叉樹基本操作

2021-06-09 23:19:59 字數 4027 閱讀 1817

tree.h

#ifndef tree_h

#define tree_h

#include typedef int element;

/*定義二叉樹*/

typedef struct nodetreenode;

void preorder(treenode *root);//遞迴前序遍歷

void inorder(treenode *root);//遞迴中序遍歷

void postorder(treenode *root);//遞迴後序遍歷

void iterationpreorder(treenode *root);//迭代前序遍歷

void iterationinorder(treenode *root);//迭代中序遍歷

void iterationpostorder(treenode *root);//迭代後序遍歷(方法一):具體思路見cpp中解釋

void iterationpostorder2(treenode *root);//迭代後序遍歷(方法二)

void iterationpostorder3(treenode *root);//迭代後序遍歷(方法三,設定標誌位)

void levelorder(treenode *root);//層序遍歷

int printtreeatlevel(treenode *root,int level);//列印樹的第level(根節點為第0層)層所有結點,成功返回1

int treedepth(treenode *root);//返回二叉樹的深度,空樹深度為0;

void releasetree(treenode* root);//遞迴釋放整個樹

//void printtreebylevel(treenode *root);//按層序遍歷,每層之後

/*b樹的查詢,查詢成功返回1,查詢失敗返回0,類似於二分查詢分為遞迴和非遞迴*/

int searchbitree(treenode *root, element key);//非遞迴

int searchbitree2(treenode *root, element key);//遞迴

//查詢b樹最小結點

treenode * bitreeminimum(treenode *root);

//查詢b樹最大結點

treenode* bitreemaximum(treenode *root);

/*在b樹root中查詢元素item是否存在,若存在返回0,若不存在,

把item結點插入到當前結點的左指標或右指標上,並返回1*/

int insertbitree(treenode ** root,element item);

//b樹的刪除操作

void deletebitree(treenode* root,element key);

bool deletebst(treenode *root, element key);

bool delete(treenode* p);

//★★★★★★★遞迴的本質是編譯器生成乙個函式呼叫的棧

#endif

tree.cpp

#include #include #include using namespace std;

#include "tree.h"

int searchbitree(treenode *root, element key)

else if(p->data < key)else

}return 0;

}int searchbitree2(treenode *root, element key)

else if(p->data < key)else

}treenode * bitreeminimum(treenode *root)

treenode* bitreemaximum(treenode *root)

int insertbitree(treenode ** root,element item)

parent =current;//記錄查詢到的最後結點,新結點作為該結點的兒子結點

if(current->data < item)else

}//查詢失敗,插入

p=(treenode*)malloc(sizeof(treenode));//無free

if(p==null)

p->data=item;

p->leftchild=null;

p->rightchild=null;

if(parent==null)

*root = p;

else if(parent->data > item)else

return 1;

}void deletebitree(treenode* root,element key)//測試有誤

if(p->data > key)

deletebitree(p->leftchild,key);

else if(p->data < key)

deletebitree(p->rightchild,key);

elseelse

}}void preorder(treenode *root)

}void inorder(treenode *root)

}void postorder(treenode *root)

}void iterationpreorder(treenode *root)

}void iterationinorder(treenode *root)

if(!stk.empty())//棧不為空

else

}}void iterationpostorder(treenode *root)//繼續學習

else

} }void iterationpostorder2(treenode *root)//繼續學習

elseelse

}

}

}void iterationpostorder3(treenode *root)//設定標誌位

void levelorder(treenode *root)

while(!que.empty())

}int printtreeatlevel(treenode *root,int level)

return printtreeatlevel(p->leftchild,level-1) + printtreeatlevel(p->rightchild,level-1);

}int treedepth(treenode *root)

void releasetree(treenode* root)

}bool deletebst(treenode *root, element key)

else if(key < root->data)

return deletebst(root->leftchild, key);

else

return deletebst(root->rightchild, key);

}}bool delete(treenode* p)

else if(p->leftchild == null)

else

p->data = s->data; //s指向被刪結點的「前驅」

/*s->rightchild為空,s->leftchild可能為空也可能不為空,

p=q說明s是p(即q)的左子節點,q->leftchild = s->leftchild;

p!=q說明s是q的右子節點,q->rightchild = s->leftchild;

*/if(q!=p)

q->rightchild = s->leftchild; //重接*q的右子樹,q為s的父節點

else

q->leftchild = s->leftchild; //重接*q的左子樹,q為s的父節點

delete s;

}return true;

}

二叉樹基本操作

一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 6 int left size 7 int right size 為了操作簡便,我們定義一棵不需要儲存資料的二叉樹,只要能儲存節點之間的邏輯關係就行,所以用兩個陣列來表示。left i 第i個節點的左子節點的序號 right i 第i個節點...

二叉樹基本操作

include include define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str 由str串建立二叉鏈 j ch str j btnode f...

二叉樹基本操作

include include include using namespace std template struct binode template class bitree bitree datatype a,intn bitree void preorder void inorder void...