template模板的知識
二叉樹的基本知識
感謝:鏈結
templatestruct binode;
node 結點
這個結構體就是用來儲存二叉鏈的每乙個節點的
表示這個節點所存的值
表示指向 左子樹 和 右子樹 的指標
這樣的結構能很好地存下二叉樹:
(具體的建樹方法會放在後面解釋)
template class bitree
~bitree()
//遍歷
void preorder()
void inorder()
void postorder()
void leverorder();
//樹的深度
int depth()
//葉子結點數量
void caculateleafnum()
//交換左右子樹
void swap()
private:
binode*root;//
binode*creat(binode*bt);
void release(binode*bt);
void preorder(binode*bt);
void inorder(binode*bt);
void postorder(binode*bt);
int depth(binode*root);
void caculateleafnum(binode* root);
void swap(binode*root);
};
這便是樹的主體
乙個 bitree 的類就代表一顆二叉樹
在這裡定義了一些之後會用到的函式以及建構函式和折構函式
這裡知道有這些東西即可
這裡則有一些 public 會用到的函式
以及這個樹的根節點
建構函式
在類中 是這樣寫的:
bitree()
構造這個樹是通過 creat 這個函式來實現的
creat_code:
template binode*bitree::creat(binode*bt)
return bt;
}
在講建構函式之前
還需要提一嘴其輸入方式
這裡是採用前序遍歷的方式進行輸入
同時還需要以 "#" 輸入葉子結點的空子結點
例子:cin:
知道了輸入的順序之後
**就變得好理解很多了
建立乙個結點的時候
首先輸入這個結點的值(就是 t)
若其值是 "#" 那就不繼續往下面創造新結點了
直接讓 bt 為 空指標
並把這個指標返回
若其值不為 "#"
那說明後面可能還有結點需要新增
就繼續在左右子結點上呼叫 creat函式
bt = new binode;
這行**可能還需要解釋一下
new 是用來開闢新的記憶體空間的關鍵字
這裡相當於開闢了乙個新的結點結構體
而 bt 存下了這個結點結構體的指標
折構函式
~bitree()
折構函式和建構函式一樣是用類名來作為函式名的
不過需要在前面加乙個 "~"
這個函式呼叫了 release 這個函式
templatevoid bitree::release(binode*bt)
}
這個函式因該很好理解
就是從上往下搜
從下往上刪
就不過多解釋了
這個分兩部分將
第一部分 : 前/中/後序遍歷
這些**原理相同 就隨便挑乙個講好了
template void bitree::preorder(binode*bt)
}
從 root結點 開始搜尋
如果不是空結點 那就直接輸出
然後往兩邊找
決定前中後的只在於
輸出與往兩側搜尋語句的順序
第二部分 : 層序遍歷
還是用這個圖
}這裡是用乙個陣列和兩個變數來實現了佇列的功能
接下來我們來模擬一下
這樣就可以實現層序遍歷了
code:
templateint bitree::depth(binode*root)
}
深度要找的是最深的葉子結點的層數
因此直接左右找取最大值即可
code:
templatevoid bitree::caculateleafnum(binode*root)
首先我們要知道葉子結點的特徵:
沒有兒子節點
(就是所有兒子節點都為 null)
所以左右搜找到無兒子 +1 即可
templatevoid bitree::swap(binode*root)
}
由於二叉鏈的本質就是指標的堆疊
因此直接交換指標的存值就可以了
#includeusing namespace std;
templatestruct binode;
template class bitree
~bitree()
//遍歷
void preorder()
void inorder()
void postorder()
void leverorder();
//樹的深度
int depth()
//葉子結點數量
void caculateleafnum()
//交換左右子樹
void swap()
private:
binode*root;
binode*creat(binode*bt);
void release(binode*bt);
void preorder(binode*bt);
void inorder(binode*bt);
void postorder(binode*bt);
int depth(binode*root);
void caculateleafnum(binode* root);
void swap(binode*root);
};int leaf_count = 0;
template binode*bitree::creat(binode*bt)
return bt;
}templatevoid bitree::release(binode*bt)
}template void bitree::preorder(binode*bt)
}templatevoid bitree::inorder(binode*bt)
}templatevoid bitree::postorder(binode*bt)
}templatevoid bitree::leverorder()
}templateint bitree::depth(binode*root)
}templatevoid bitree::caculateleafnum(binode*root)
templatevoid bitree::swap(binode*root)
}int main()
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...