什么是二叉树
二叉树不同于别的树,因为他每个节点最多只有两个子节点,而别的树可以有无数个子节点。
所以二叉树就是只最多只有两个子节点的树,一个子节点叫右子节点,另一个子节点叫左子结点
而他们的上一层就是父子节点,最上层叫根节点
二叉树的种类
二叉树分三个种类普通二叉树,满二叉树,完全二叉树
普通二叉树不用说,先说说满二叉树
满二叉树
我们可以通过他的名字就可以知道---------它的每个节点都有两个子节点(除了最后一层),而且每一层节点数都是满的。
我们可以观察一下每层节点的个数,1,2,4,8…,观察下,这不就是等差数列嘛,,但是用等差数列不能够发现特点,所以我们可以将它换个形态:2^0, 2^1, 2^2, 2^3…
所以满二叉树每个层的节点数是2^(k-1)个(k是层数),再根据这个特点我们同样也可以结合等差数列推出每个满二叉树的总结的数: 2^k-1(k总层数)
完全二叉树
完全二叉树的概念是每层从左到右不断的叫完全二叉树(看不懂可以看图)比如图上就是个典范的完全二叉树,但下图就不是完全二叉树
为什么他不是呢因为6号位的左子节点没有,但有右子节点,而右子节点没有和5号位的右子节点连通
所以不构成完全二叉树
完全二叉树的特点:其实满二叉树属于特殊的完全二叉树,所以完全二叉树的每一层(除了最后一层)的节点数也是2^(k-1)(k层数),而完全二叉树的总结点数是前(k-1)层的总节点数+最后一层的节点数。
二叉树c++代码
了解完二叉树就可以代码了
二叉树的初始化
二叉树的初始化有两种
第一种struct
typedef struct node
{char date; //父子节点struct node *left;//左子结点struct node *right; //右子节点
}BiTNode; BiTNode *creatBiTree()
{char k;cin>>k;if(k=='#')return NULL;BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));T->data=k; //父子节点//递归T->left=creatBiTree();//左子结点T->right=creatBiTree();//右子节点return T;
}
第二种数组(个人比较喜欢数组)
int ab[105][2];
for(循环){
ab[i][0]=b; //左子结点
ab[i][1]=c; //右子节点
}
二叉树的遍历
二叉树的遍历主要是递归
先序遍历
父子节点->左子结点->右子节点
void dfs1(int x){if(x==0){return ;}cout<<x<<" ";dfs1(ab[x][0]);dfs1(ab[x][1]);
}
中序遍历
左子结点->父子节点->右子节点
void dfs2(int x){if(x==0){return ;}dfs2(ab[x][0]);cout<<x<<" ";dfs2(ab[x][1]);
}
后序遍历
左子结点->右子节点->父子节点
void dfs3(int x){if(x==0){return ;}dfs3(ab[x][0]);dfs3(ab[x][1]);cout<<x<<" ";
}
最后是一道题目
二叉树遍历加强版
时间限制:1 s内存限制:128 MB
二叉树的每个结点包含一个大写字母,且两两不同。
给出二叉树的前序遍历和中序遍历,求后序遍历。
输入
第一行给出一个字符串表示前序遍历。
第二行给出一个字符串表示中序遍历。
遍历结果只由大写字母组成,非空,且长度不超过26。
输出
输出后序遍历的结果。
样例
输入 1
DBACEGF
ABCDEFG
输出 1
ACBFGED
输入 2
BCAD
CBAD
输出 2
CDAB
【分析】其实这道题的思路很简单就是先构造树再后序遍历,当然有思路可是怎么构造二叉树是个问题,不过不如我们先观察
观察后我们可以发现中序遍历中根节点的左边是整个左子树,右边是整个右子树
这就很简单了,每次递归左子树和右子树就可以构造出整个树,随后再回溯,获取每棵子树的根节点
代码如下
#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<char>ans;
void dfs(int l1,int r1,int l2,int r2){if(l1>r1||l2>r2){return ;}int p=-1;for(int i=l2;i<=r2;i++){if(b[i]==a[l1]){p=i;break;}}int len=p-l2;dfs(l1+1,l1+len,l2,l2+len-1);//访问左子树dfs(l1+len+1,r1,p+1,r2);//访问右子树ans.push_back(a[l1]);
}
int main()
{
cin>>a>>b;
int n=a.size();
dfs(0,n-1,0,n-1);
for(int i=0;i<n;i++) cout<<ans[i];return 0;
}