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