二叉树中的DFS和BFS
来源:互联网 发布:小岛秀夫离职原因知乎 编辑:程序博客网 时间:2024/06/02 05:31
二叉树遍历应该是二叉树中的基础了,二叉树遍历根据根节点的打印顺序又分为三种:
- 前序遍历
- 中序遍历
后序遍历
这三种遍历顺序,都是属于二叉树中的深度优先搜索(DFS),即每次都是先搜索到叶子节点,然后返回到其父节点,再继续向下搜索。因为中序遍历优先处理的是左节点,后序遍历优先处理的是右节点,前序遍历优先处理的是根节点。而层序遍历(即从左到右一层层的遍历)又属于二叉树中的广度优先搜索(BFS)。
通过以上,我们可以看到二叉树遍历既可以用DFS、又可以用BFS实现。至于用哪个参考具体问题。
DFS在二叉树中有两种实现方法:递归
栈
递归我这里就不说了,应该是很容易实现的。
接下来说栈,栈这种结构是先进后出的,这是很符合DFS的搜索特点的,即先搜索到叶子节点,然后返回到其父节点,再继续向下搜索。以上不都是栈的特性吗?
下面贴出中序遍历、后序遍历、前序遍历通过栈实现的代码:Binary Tree Inorder Traversal
/*Definition for a binary tree node.*/struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};vector<int> inorderTraversal(TreeNode* root) { vector<int> res; std::stack<TreeNode*> temp; while (root || !temp.empty()) { while (root) { temp.push(root); root = root->left; } root = temp.top(); temp.pop(); res.push_back(root->val); root = root->right; } return res; }
- Binary Tree Postorder Traversal
vector<int> postorderTraversal(TreeNode* root) { vector<int> res; std::stack<TreeNode*> temp; while (root || !temp.empty()) { while (root) { temp.push(root); //这里不用insert也可以的,可以像中序遍历一样把'res.push_back(root->val);' 放在'root = temp.top();'后面 res.insert(res.begin(),root->val); root = root->right; } root = temp.top(); temp.pop(); root = root->left; } return res;}
- Binary Tree Preorder Traversal
/*solution 1*/vector<int> preorderTraversal(TreeNode* root) { vector<int> res; std::stack<TreeNode*> temp; while (root || !temp.empty()) { while (root) { temp.push(root); res.push_back(root->val); root = root->left; } root = temp.top(); temp.pop(); root = root->right; } return res;}/*solution 2*/vector<int> preorderTraversal(TreeNode *root) { if (root==NULL) { return vector<int>(); } vector<int> result; stack<TreeNode *> treeStack; treeStack.push(root); while (!treeStack.empty()) { TreeNode *temp = treeStack.top(); result.push_back(temp->val); treeStack.pop(); if (temp->right!=NULL) { treeStack.push(temp->right); } if (temp->left!=NULL) { treeStack.push(temp->left); } } return result;}
而至于BFS在二叉树中目前看到的也是有两种方法:
- 递归
- 队列
递归要在递归函数参数中传递现在的层数,而队列的实现,大部分代码同先序遍历的solution 2一样,只不过这次先压的是左节点,再压有节点。
0 0
- 二叉树中的DFS和BFS
- 二叉树类和DFS,BFS
- 用二叉树区分DFS和BFS
- 二叉树的DFS和BFS
- 二叉树的DFS/BFS
- 图论中的BFS和DFS
- 算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS
- 二叉树深度优先(DFS)和广度优先(BFS)算法的非递归实现
- 算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS
- 树和图的BFS 和 DFS
- 二叉树DFS与BFS的问题整理
- DFS和BFS
- BFS和DFS模板
- BFS和DFS算法
- BFS和DFS算法
- BFS和DFS
- dfs 和 bfs 解析
- POJ3083 -- BFS和DFS
- 无
- 我的第一个FPGA小程序---测占空比
- java处理Excel
- CentOS安装后ifconfig 无法显示网卡
- android中String与InputStream之间的相互转换方式
- 二叉树中的DFS和BFS
- JS Location & History & Screen
- 【bzoj1005】 HNOI2008—明明的烦恼
- 和为S的连续正数序列
- 以声明方式在一个标题窗格内添加调色板的代码片段
- CAN总线
- 百度地图api的覆盖物样式与bootstrap样式冲突解决办法
- Java在循环中删除集合中的元素
- Android 使用aidl实现进程间通信-传递自定义的类