目录
-
二叉树的结构定义
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
一.二叉树的广度优先遍历
广度优先排序(宽度优先排序或者横向优先搜索)是从根结点开始沿着树的宽度搜索遍历。按层次的去遍历。依次遍历根节点,然后是左孩子和右孩子。
从上到下,从左到右依次打印出来,就是ABCDEFG。
实现思路,用队列实现。A入队,从根结点开始。接着A的两个孩子不空,BC入队(A出队,队头指向B);然后B的两个孩子DE入队,B出队,队头指向C;C的两个孩子FG进入,C出队;最后将DEFG输出。
参考moonbaby博客-按层遍历二叉树
二.二叉树的深度优先遍历
深度优先遍历沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
思想是从上至下,对每一个分支一直往下一层遍历直到这个分支结束,然后返回上一层,对上一层的右子树这个分支继续深搜,直到一整棵树完全遍历。
深度优先遍历有三种遍历方法:
前序遍历、中序遍历、后序遍历
1.递归实现
- 前序遍历(根左右)
void PreOrderTrverse(TreeNode* root){
if(root==NULL)
return;
printf("%d",root->val);
if(root->left !=NULL)
PreOrderTrverse(root->left);
if(root->right !=NULL)
PreOrderTrverse(root->right);
}
- 中序遍历(左根右)
void InOrderTrverse(TreeNode* root){
if(root==NULL)
return;
if(root->left !=NULL)
PreOrderTrverse(root->left);
printf("%d",root->val);
if(root->right !=NULL)
PreOrderTrverse(root->right);
}
- 后序遍历(左右根)
void PostOrderTrverse(TreeNode* root){
if(root==NULL)
return;
if(root->left !=NULL)
PreOrderTrverse(root->left);
if(root->right !=NULL)
PreOrderTrverse(root->right);
printf("%d",root->val);
}
2.非递归实现
深度优先遍历是遍历根节点,左子树,最后遍历右子树。利用栈结构,先将右子树压栈,然后在对左子树压栈。先进的后出。此时,左子树节点是在top上的,可以先遍历左子树。
输出顺序为:ABDECFG
void depthFirstSearch(TreeNode* root){
stack<TreeNode*> sta;
//头节点入栈
sta.push(root);
TreeNode* p;
while(!sta.empty()){
p=sta.top();
printf("%d",p->val); //遍历根节点
sta.pop();
if(p->right != NULL) //先压栈右子树
sta.push(p->right);
if(p->left != NULL) //后压栈左子树
sta.push(p->left);
}
}
python实现
def preOrder(self,root):
if root==None:
return
stack=[]
stack.append(root)
while stack:
cur = stack.pop()
print(cur.val)
if cur.rchild!=None:
stack.append(stack.rchild)
if cur.lchild!= None:
stack.append(stack.lchild)