二叉樹基礎

2021-07-13 03:41:15 字數 4457 閱讀 2700

二叉樹:二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。

二叉樹節點結構:

};二叉樹的建立:

node* _createtree(const t* a, size_t size, size_t& index, const t& invilid)

return root; //返回根節點

}

前序遍歷:

/* 前序遍歷:根->左子樹->右子樹 */

void _prevorder(node* root)

cout<_data>

_prevorder(root->_left); //遞迴遍歷左子樹

_prevorder(root->_right); //遞迴遍歷右子樹

}

中序遍歷:

/* 中序遍歷:左子樹->根->右子樹 */

void _inorder(node* root)

_inorder(root->_left); //遞迴遍歷左子樹

cout<_data>

_inorder(root->_right); //遞迴遍歷右子樹

}

後序遍歷:

/* 後序遍歷:左子樹->右子樹->根 */

void _postorder(node* root)

_postorder(root->_left); //遞迴遍歷左子樹

_postorder(root->_right); //遞迴遍歷右子樹

cout<_data>

}

層次遍歷:

/* 層次遍歷:第一層->最後一層 */

void _levelorder(node* root)

qt.push(root);        //將根節點壓到佇列中

while(!qt.empty())

/* 當根節點的右孩子不為空,就說明這一層還沒有完全壓入佇列中 */

if(qt.front()->_right != null)

cout<_data>

qt.pop();       //將列印的節點出佇列

}}

二叉樹節點的個數 = 就是左子樹節點個數加上右子樹節點的個數再加上根節點

size_t _size(node* root)

return _size(root->_left)+_size(root->_right)+1;//左子樹節點+右子樹節點+根節點

}

二叉樹的深度 = 左子樹 >= 右子樹 ? 左子樹+1, 右子樹+1;

size_t _depth(node* root)

size_t leftdepth = _depth(root->_left);

size_t rightdepth = _depth(root->_right);

if(leftdepth >= rightdepth)

else

}

二叉樹葉子節點的個數 = 左子樹的葉子節點 個數+ 右子樹的葉子節點個數

size_t _leafsize(node* root)

if(root->_left == null && root->_right == null)    //只有根節點

return _leafsize(root->_left)+_leafsize(root->_right);

}

整體**:

#include #include using namespace std;

template struct binarytreenode

};templateclass binarytree

binarytree(const t* a, size_t size, const t& invilid)

:_root(null)

binarytree(const binarytree& tree)

binarytree& operator= (binarytree tree)    //現代式寫法

~binarytree() }

public:

void prevorder()

size_t _depth(node* root)

size_t leftdepth = _depth(root->_left);

size_t rightdepth = _depth(root->_right);

if(leftdepth >= rightdepth)

else

}size_t _leafsize(node* root)

if(root->_left == null && root->_right == null)

return _leafsize(root->_left)+_leafsize(root->_right);

}protected:

/* 前序遍歷:根->左子樹->右子樹 */

void _prevorder(node* root)

cout<_data>

_prevorder(root->_left); //遞迴遍歷左子樹

_prevorder(root->_right); //遞迴遍歷右子樹

} /* 中序遍歷:左子樹->根->右子樹 */

void _inorder(node* root)

_inorder(root->_left); //遞迴遍歷左子樹

cout<_data>

_inorder(root->_right); //遞迴遍歷右子樹

} /* 後序遍歷:左子樹->右子樹->根 */

void _postorder(node* root)

_postorder(root->_left); //遞迴遍歷左子樹

_postorder(root->_right); //遞迴遍歷右子樹

cout<_data>

} /* 層次遍歷:第一層->最後一層 */

void _levelorder(node* root)

qt.push(root);

while(!qt.empty())

if(qt.front()->_right != null)

cout<_data>

qt.pop();

} }protected:

node* _copy(node* root)

node* newroot = new node(root->_data); //建立新的根節點

node* newcur = newroot;

newcur->_left = _copy(root->_left);

newcur->_right = _copy(root->_right);

return newroot;

} void _destroy(node* root)

if(root->_left == null && root->_right == null)

_destroy(root->_left);

_destroy(root->_right);

} node* _createtree(const t* a, size_t size, size_t& index, const t& invilid)

return root; //返回根節點

}protected:

node* _root;    //根節點

};int main()

測試結構:

測試**:

void test()

; binarytreetree(array, 10, '#');

tree.prevorder();

tree.inorder();

tree.postorder();

tree.levelorder();

binarytreetree2(tree);

tree2.prevorder();

binarytreetree3 = tree2;

tree3.prevorder();

}

測試結果:

本文出自 「pzd流川楓」 部落格,請務必保留此出處

二叉樹基礎

最近學習的一些筆記,記錄一下 樹是一種非線性結構,樹 這種資料結構真的很像我們現實生活中的 樹 這裡面每個元素我們叫 節點 例如下面這幅圖,a 節點就是 b 節點的父節點,b 節點是 a 節點的子節點。b c d 這三個節點的父節點是同乙個節點,所以它們之間互稱為兄弟節點。我們把沒有父節點的節點叫作...

二叉樹基礎

1.二叉樹的定義 每個結點最多只有兩棵子樹 子樹左右有順序之分 2.常見的二叉樹型別 滿二叉樹 看起來 完美 而又 平衡 的樹 完全二叉樹 首先從上至下,從左至右按順序給結點編號,再從下至上,從右至左按順序刪除結點。由此可見滿二叉樹是一棵特殊的完全二叉樹,而完全二叉樹是 缺胳膊少腿 的滿二叉樹。3....

二叉樹基礎

在電腦科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用於實現二叉查詢樹和二叉堆。1 在非空二叉樹中,第i層的結點總數不超過2i 12 2i 1 i 1 2 深度為h的二叉樹最多有 2 h2 h 2h...