二叉樹基本操作大全

2021-09-01 08:34:23 字數 4245 閱讀 4420

1.二叉樹的基本操作

這裡我有乙個疑問:

在使用建構函式的時候,傳引數的問題?

開始我是這麼理解的------只使用指標(其實指標本身就是乙個位址,相當於引用,也會改變root建立起二叉樹),而2指標的引用,相當於就是對記錄了指標的位址,採用了二次引用,其實是沒有必要的,一次就夠了。但是實際上用的時候並不是這樣?根本不能建立二叉樹,原因是因為開始指標指向的是乙個不確定的位置?然後我又實驗了,分配空間先,但是還是不行?所以不知道為什麼一定要使用雙重指標或指標引用?不知哪位高人能解答之,謝謝了

就是這樣void creattree(node* root);

//宣告類bitree及定義結構binode,檔名為bitree.h

#ifndef bitree_h

#define bitree_h

template struct node //二叉樹的結點結構

;//定義佇列或棧空間大小

const int size = 100;

template class bitree

;#endif

2.基本操作實現

#include #include "bitree.h"

using namespace std;

//建構函式,初始化一棵二叉樹,其前序序列由鍵盤輸入

template bitree::bitree( )

template bitree::bitree(t* a, int n)

//析構函式,釋放二叉鍊錶中各結點的儲存空間

template bitree::~bitree()

//獲得指向根結點的指標

template node* bitree::getroot()

//前序遍歷二叉樹

template void bitree::preorder(node*root)

}

//中序遍歷二叉樹

template void bitree::inorder(node*root)

}

//後序遍歷二叉樹

template void bitree::postorder(node*root)

} //層序遍歷二叉樹

template void bitree::leverorder(node*root) }}

//層序遍歷二叉樹(利用迴圈佇列)

/*template void bitree::leverorder(node*root)

if(t->rchild)

} }}*/

//-------------------------建立樹的三種引數設定方法---------------------------------

//有參構造函式呼叫(前序遞迴建立樹,輸入順序也必須是前序)

/*template void bitree::creattree(node**root)

}

*//*

template node* bitree::creattree()

return root;

} */

template void bitree::creattree(node* &root)

} template void bitree::createtree(node* &root, t* s, int n)else

int i=1;//注意不管出不出棧,或者是空節點,i都要往前,出一次棧對應i前進2

while(front != rear && i;

m->data = s[i++];

p->lchild = m;

queue[rear++] = m;

if(s[i] != "#")else

}elseelse

}//cout<

//前序遍歷二叉樹(非遞迴)

//它是在進棧的時候輸出

template void bitree::nrpreorder(node*root)

//如果左孩子為空了,然後出棧,遍歷右結點

if(top != 0) }}

//中序遍歷二叉樹(非遞迴)

//它是在出棧的時候輸出

template void bitree::nrinorder(node*root)

//如果左孩子為空了,然後出棧,遍歷右結點

if(top != 0)

}}

//後序遍歷二叉樹(非遞迴)

//需要設定標誌位,

template void bitree::nrpostorder(node*root)

//可以出棧

while(top != 0 && flag[top-1] == 1)

if(top != 0)else

}}//搜尋節點x

template void bitree::search(node* root, t x, node* &p)

search(root->lchild, x, p);

search(root->rchild, x, p); }}

//尋找值為data的節點

template node* bitree::searchnode(t x)

return r;

}

//二叉樹深度

template int bitree::bitreedepth(node* root)

return 0;

}

//如果存在值為data的節點,返回其父節點

template node* bitree::getparent(node* root, t x)

//如果左子樹找到了返回雙親

if(q = getparent(root->lchild, x)) return q;

//如果左子樹沒找到,則到右子樹找

else if(q = getparent(root->rchild, x)) return q;

//如果左右都沒找到則返回空

else return null; }}

//獲取左兄弟

template node* bitree::getleftsibling(node* root, t x)

if(root->rchild && root->rchild->data==x)

return getleftsibling(root->lchild, x);

return getleftsibling(root->rchild, x);

}}

//獲取右兄弟

template node* bitree::getrightsibling(node* root, t x)

if(root->lchild && root->lchild->data==x)

return getrightsibling(root->lchild, x);

return getrightsibling(root->rchild, x);

}}

//葉子個數

template int bitree::leafcount(node* root)else

}

//節點個數

template int bitree::nodecount(node* root)

} template void bitree::deletesibtree(node* root, t x)else if(root->rchild && root->rchild->data==x)else

}}

3.測試程式

//二叉樹的主函式,檔名為bitreemain.cpp

#include#include#include"bitree.cpp"

using namespace std;

int main()

; //string a = ;

string a = ;

bitreebt(a, 15); //建立一棵樹(按層序輸入)

node* root = bt.getroot( ); //獲取指向根結點的指標

cout<

cout<

t = bt.searchnode("b");

if(t) coutdatadata

每個操作的一些注意事項都在**中進行了說明,主要注意一下,建立二叉樹的時候,如何輸入節點?見下圖:

二叉樹基本操作

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