二叉樹的基本操作

2022-07-27 03:09:09 字數 4288 閱讀 1004

tree.h

#ifndef tree_h

#define tree_h#include

typedef

intelement;

/*定義二叉樹

*/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 else

}return0;

}int searchbitree2(treenode *root, element key)

else

if(p->data else

}treenode * bitreeminimum(treenode *root)

treenode* bitreemaximum(treenode *root)

int insertbitree(treenode **root,element item)

parent =current;//

記錄查詢到的最後結點,新結點作為該結點的兒子結點

if(current->data 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

return1;

}void deletebitree(treenode* root,element key)//

測試有誤

if(p->data >key)

deletebitree(p->leftchild,key);

else

if(p->data deletebitree(p->rightchild,key);

else

else

}}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)//

繼續學習

else

else

}

}

}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

;}

二叉樹基本操作

tree.h ifndef tree h define tree h include typedef int element 定義二叉樹 typedef struct nodetreenode void preorder treenode root 遞迴前序遍歷 void inorder treen...

二叉樹基本操作

一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 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...