二叉树先序遍历
定义:如果二叉树为空,则进行空操作,否则每次遍历的顺序是先根节点-->先序遍历左子树-->先序遍历右子树===>完全可以自己举例子去理解,如下图所示。
相应代码如下:
递归版本:
void pre_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; vec.push_back(root->val); pre_search(root->left,vec); pre_search(root->right,vec); }
迭代版本:
void pre_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; stack<TreeNode *> s; while(root) { vec.push_back(root->val); s.push(root); root=root->left; } while(!s.empty()) { TreeNode *tmp=s.top(); s.pop(); tmp=tmp->right; while(tmp) { vec.push_back(tmp->val); s.push(tmp); tmp=tmp->left; } } }
二叉树中序遍历
定义:如果二叉树为空,则进行空操作,否则每次遍历的顺序是先中序左节点-->根节点-->中序右节点===>完全可以自己举例子去理解,如下图所示。
相应代码如下:
递归版本:
void mid_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; mid_search(root->left,vec); vec.push_back(root->val); mid_search(root->right,vec); }
迭代版本:
void mid_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; stack<TreeNode *> s; while(root) { s.push(root); root=root->left; } while(!s.empty()) { TreeNode *tmp=s.top(); s.pop(); vec.push_back(tmp->val); tmp=tmp->right; while(tmp) { s.push(tmp); tmp=tmp->left; } } }
二叉树后序遍历
定义:如果二叉树为空,则进行空操作,否则每次遍历的顺序是先后序序左节点-->后序右节点-->根节点===>完全可以自己举例子去理解,如下图所示。
递归版本:
void behind_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; behind_search(root->left,vec); behind_search(root->right,vec); vec.push_back(root->val); }
迭代版本:
思路:
1、与前中序不同的在于,后序遍历需要有个状态量表示该结点是否是到了输出数值放入res中的时候,每一个刚放入的结点状态量一定是false,因为不知道它下面是否还有子结点(后序遍历的顺序),只有判断了是否有子结点以后,该状态量才会变为true(无论有还是无子结点,都是会变成真的,表示可以输出数值了!),放入栈的顺序不能变,即先右结点后左结点!!(多想想后序遍历的规则就能理解)
2、两个栈,一个是用来存放结点的(便于按后序遍历的顺序存放结点),一个是状态量,存放每个对应结点的状态(是否可以输出数值!)
void behind_search(TreeNode *root,vector<int> &vec) { if(root==NULL) return ; stack<TreeNode *> data; stack<bool> flag; data.push(root); flag.push(false); while(!data.empty()) { TreeNode *Node=data.top(); bool isvisit=flag.top(); if(isvisit) { vec.push_back(Node->val); data.pop(); flag.pop(); } else { flag.pop(); flag.push(true); if(Node->right) { data.push(Node->right); flag.push(false); } if(Node->left) { data.push(Node->left); flag.push(false); } } } }
二叉树广度优先遍历(层次遍历)--bfs(breach first search)
定义:就是一层一层的从左往右的打印出元素来,直到最后一层打印完成
相应代码如下:
void bfs(Treenode *root,vector<int> vec) { if(root==NULL) return ; queue<Treenode *> q; q.push(root); while(!q.empty()) { int n =q.size(); for(auto i =0;i<n;++i) { Treenode *tmp=q.front(); q.pop(); vec.pus_back(tmp->val); if(tmp->left) q.push(tmp->left); if(tmp->right) q.push(tmp->right); } } }
二叉树深度优先遍历(回溯法)---递归
定义:就是每一趟都是选定一条路径(从根节点到叶子结点),打印出来以后,回溯到上一层,看是否还有别的可选路径,如果存在就再次打印出来,如果不存在就返回再上一层看是否有可选路径,直到所有的情况都遍历完全为止
回溯法心得:
- 首先肯定是要用到递归的!一般也是自己定义的递归函数
- 自定义的递归函数参数肯定需要包含存放结果的res容器、能够表示每条路径的容器tmp、跳出递归的条件,这三个内容(但不代表参数只有3个!)是肯定需要包含的,具体其他内容需根据题目要求而定