二叉树
二叉数的概念和分类
二叉树是每个树节点最多有两个子树的一种特殊的树结构,其有一些内在的性质,
比如,若二叉树的层次从0开始,则在二叉树的第i层至多有 [公式] 个节点(i>=0)
,高度为k的二叉树最多有 [公式] 个节点(空树的高度为-1)。其类别为以下几种:
满二叉树:所有的叶节点全部在底层,并且在底层全部铺满的二叉树
完全二叉树:叶节点只能出现在最后两层,并且最底层的叶节点都向左对齐
二叉搜索树:要求每个节点本身大于其左子树,而小于其右子树,对其进行中序遍历后,
会得到一个有序的列表,这是我们经常用到的一种数的结构
平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右
两个子树都是一棵平衡二叉树,并且满足二叉搜索树的规则。
二叉树三种遍历模式
前序 中序 后序
接下来我们以这个图为例进行Coding,用代码来实现这三种遍历方式:
先序遍历 0 1 3 7 8 4 9 2 5 6
中序遍历 7 3 8 1 9 4 2 5 2 6
后序遍历 7 8 3 9 4 1 5 6 2 0
递归版的三种遍历
// 递归版
// 先序遍历
void printPreorder1(TreeNode* head){
if (head == nullptr){
return;
}
cout << head->value << " ";
printPreorder1(head->left);
printPreorder1(head->right);
}
// 中序遍历
void printInorder1(TreeNode* head){
if (head == nullptr){
return;
}
printInorder1(head->left);
cout << head->value << " ";
printInorder1(head->right);
}
// 后序遍历
void printPostorder1(TreeNode* head){
if (head == nullptr){
return;
}
printPostorder1(head->left);
printPostorder1(head->right);
cout << head->value << " ";
}
非递归版的三种遍历
先序遍历
// 迭代版
void printPreorder2(TreeNode* head){
cout << "Pre Order:" << endl;
if (head != nullptr){
stack<TreeNode*> *sta = new stack<TreeNode*>;
sta->push(head);
TreeNode* cur = head;
while(!sta->empty()){
cur = sta->top();
sta->pop();
cout << cur->value << " ";
if (cur->right != nullptr){
sta->push(cur->right);
}
if (cur->left != nullptr){
sta->push(cur->left); // 先压右边节点,再压左边节点,这与栈的特性有关
}
}
}
cout << endl;
}
中序
void printInorder2(TreeNode* head){
cout << "In Order:" << endl;
if(head != nullptr){
stack<TreeNode*>* sta = new stack<TreeNode*>;
TreeNode* cur = head;
while(!sta->empty() || cur != nullptr){
if(cur != nullptr){
sta->push(cur);
cur = cur->left;
}else{
cur = sta->top();
sta->pop();
cout << cur->value << " ";
cur = cur->right;
}
}
}
cout << endl;
}
后序
void printPostorder2(TreeNode* head){
cout << "Post Order:" << endl;
if (head != nullptr){
stack<TreeNode*>* sta1 = new stack<TreeNode*>;
stack<TreeNode*>* sta2 = new stack<TreeNode*>;
TreeNode* cur = head;
sta1->push(cur);
while(!sta1->empty()){
cur = sta1->top();
sta1->pop(); // 弹出的是最晚被压入栈的数据
sta2->push(cur);
if(cur->left != nullptr){
sta1->push(cur->left);
}
if(cur->right != nullptr){
sta1->push(cur->right);
}
}
while(!sta2->empty()){
cur = sta2->top();
sta2->pop();
cout << cur->value << " ";
}
}
cout << endl;
}