二叉樹:二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。
二叉樹節點結構:
};二叉樹的建立:
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...