二叉樹的構建要注意與鏈式表的區別,二叉樹這裡的構建十分低階,每個樹只是構建了乙個單一的二叉樹節點,總體來看是有下向上構建的。使用者需要手動去構建自己需要的樹,而不是直接去插入資料就到二叉樹中了,因為不是鏈式結構的單一,二叉樹十分豐富的。
提一下遍歷:
迭代的方式遍歷十分簡單。先序、中序、後序遍歷都只是針對根節點。比如中序,就是先遍歷左子樹-->根節點-->右子樹。(根節點在中間)
下面看**:
/*
1) 樹的基本概念:
度:說白了就是節點擁有的子分支數
葉子節點:說白了就是度為0的節點
雙親:說白了就是父親節點
層次:約定根節點為1,以後的子節點依次遞增
高度:說白了就是層次最大的數
2)二叉樹的型別
1>滿二叉樹:葉子必須位於最後一層,並且其他節點度為2
2>擴充二叉樹:除葉子節點外,其他節點度為2
1,擴充二叉樹的最大特點在於他的外路徑長度=內路徑的長度+2*非葉節點的數目
2,典型應用就是哈弗曼編碼
3>完全二叉樹: 只有最後兩層的節點的度能小於2,並且最後1層的葉子節點必須靠左邊。
1,將整個完全二叉樹依照從左到右,從上到下的進行0-->n進行編號,若子節點序號為i,則父節點為(i-1)/2。
2,典型的應用大小堆的實現。
4>其他型別二叉樹
3)森林與二叉樹的互轉
*/template struct btnode
};template class jbbinarytree
;template jbbinarytree::jbbinarytree()
templatejbbinarytree::~jbbinarytree()
templatevoid jbbinarytree::clear()
templatet jbbinarytree::getelement() const
return _root->element;
}templatebool jbbinarytree::isempty() const
templatevoid jbbinarytree::maketree(const t &x, jbbinarytree*left, jbbinarytree*right)
templatevoid jbbinarytree::breaktree(t &x, jbbinarytree*left, jbbinarytree*right)
x = _root->element;//將這個樹的根節點的元素域轉移走
left->_root = _root->_lchild;//將左子樹單獨拆成一棵樹
right->_root = _root->_rchild;//將右子樹單獨拆成一棵樹
delete _root;
clear();
}templatevoid jbbinarytree::preorder(btnode*t)
}templatevoid jbbinarytree::inorder(btnode*t)
}templatevoid jbbinarytree::postorder(btnode*t)
}
看主程式:
#include "stdafx.h"
#include"stdlib.h"
#include"jbqueue.h"
#include"jbstack.h"
#include"jbbinarytree.h"
int main()
system("pause");
return 0;
}
結果:
資料結構之二叉樹的構建C 版
二叉樹的構建要注意與鏈式表的區別,二叉樹這裡的構建十分低階,每個樹只是構建了乙個單一的二叉樹節點,總體來看是有下向上構建的。使用者需要手動去構建自己需要的樹,而不是直接去插入資料就到二叉樹中了,因為不是鏈式結構的單一,二叉樹十分豐富的。提一下遍歷 迭代的方式遍歷十分簡單。先序 中序 後序遍歷都只是針...
資料結構之二叉樹 C 二
目錄 table of contents 類的部分實現 二叉樹是一種特殊的樹,在上一節中也介紹了樹的其他形式,例如 霍夫曼樹,b樹等。其中,二叉樹的常用操作有 1.確定樹高 2.確定元素數目 3.複製 4.顯示或列印二叉樹 5.確定兩顆二叉樹是否一樣 6.刪除整顆樹 這些操作都可以通過有步驟的遍歷二...
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...