深度遍历dfs
递归进行
根据cout在循环中的位置来确定是哪一种遍历
前序
void PreOrder(TreeNode *root){
while(root){
cout<<root->val;
PreOrder(root->left);
PreOrder(root->right);
}
}
中序
void InOrder(TreeNode *root){
while(root){
PreOrder(root->left);
cout<<root->val;
PreOrder(root->right);
}
}
后序
void PostOrder(TreeNode *root){
while(root){
PreOrder(root->left);
PreOrder(root->right);
cout<<root->val;
}
}
层次遍历bfs
利用队列先进先出的性质进行遍历
void LevelOrder(TreeNode *root){
if(!root)
return;
TreeNode t;
vector<int> ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
t=q.front();
q.pop();
ans.push_back(t->val);
if(root->left) q.push(root->left);
if(root->right) q.push(root->right);
}
}
遍历二叉树的应用
输出二叉树中的叶子结点
在遍历的时候增加判断条件:左右子树是否都为空即可
以前序遍历为例子
void PreOrder(TreeNode *root){
while(root){
if(!root->left&&!root->right){
cout<<root->val;
}
PreOrder(root->left);
PreOrder(root->right);
}
}
求二叉树的高度
分别求出左树和右树的高度,返回最大值
int GetHeight(TreeNode *root){
int lh,rh,maxh=0;
if(root){
lh=GetHeight(root->left);//左树高度
rh=GetHeight(root->rigth);//右树高度
maxh=lh>rh? lh:rh;//比较求最大高度
return maxh+1;
}
else
return 0;//递归出口
}
二元运算表达式树及其运算
三种遍历方式可得到不同的表达式结果
先序遍历:前缀表达式
中序遍历:中缀表达式
后序遍历:后缀表达式
如何由中缀表达式求二元运算表达式树?
由中缀表达式求后缀表达式
则中缀与后缀分别是树的中序与后续遍历
由两种遍历方法构建树
如何由中缀表达式求后缀表达式?
表达式求值
如何根据两种遍历方式构建树?
由两种遍历序列确定二叉树
在已知中序遍历和其他一种遍历的情况下才能唯一确定一棵树
以由后序和中序遍历确定二叉树为例
//in_order[l1..r1],post_order[l2..r2]
int build(int l1,int r1,int l2,int r2){
if(l1>r1)
return 0;//空树
int root=post_order[r2];//由后序遍历直接找到根节点
int p=l1;
while(in_order[p] != root)
p++;//在中序遍历中找到根节点的位置
int cnt=p-l1;//左子树的节点个数
//通过数组构造出二叉树
lch[root]=bulid(l1,p-1,l2,l2+cnt-1);
rch[root]=build(p+1,r1,l2+cnt,r2-1);
return root;
}