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...