LeetCode--二叉树1--树的遍历
LeetCode--二叉树1--树的遍历
一 深度遍历
- 深度遍历里面由 三种遍历方式,两种实现方法。都要熟练掌握。
- 值得注意的是,当你删除树中的节点时,删除过程将按照后序遍历的顺序进行。
- 也就是说,当你删除一个节点时,你将首先删除它的左节点和它的右边的节点,然后再删除节点本身。
Note:后序遍历在表达式上的应用
① 用递归的方式遍历二叉树
Note:
递归的实现方式里,函数的返回值需要为void类型,否则没法进行。
所以我们需要设定一个help函数来完成递归。
后序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root ) {
vector<int> nodes;
helper( root, nodes);
return nodes;
}
void helper(TreeNode *pnode , vector<int> &node_ids)
{
if( pnode == NULL)
{
std::cout << " The tree is null ! " << std::endl;
}
else
{
if(pnode != NULL)
helper(pnode->left,node_ids);
if(pnode != NULL)
helper(pnode->right,node_ids);
node_ids.push_back(pnode->val);
}
}
};
前序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root ) {
vector<int> nodes;
helper( root, nodes);
return nodes;
}
void helper(TreeNode *pnode , vector<int> &node_ids)
{
if( pnode == NULL)
{
std::cout << " The tree is null ! " << std::endl;
}
else
{
node_ids.push_back(pnode->val);
if(pnode != NULL)
helper(pnode->left,node_ids);
if(pnode != NULL)
helper(pnode->right,node_ids);
}
}
};
中序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root ) {
vector<int> nodes;
helper( root, nodes);
return nodes;
}
void helper(TreeNode *pnode , vector<int> &node_ids)
{
if( pnode == NULL)
{
std::cout << " The tree is null ! " << std::endl;
}
else
{
if(pnode != NULL)
helper(pnode->left,node_ids);
node_ids.push_back(pnode->val);
if(pnode != NULL)
helper(pnode->right,node_ids);
}
}
};
② 用非递归的方式遍历二叉树
用递归方式实现的问题都可以用非递归方法实现。
递归的本质就是利用函数栈来保存信息。
用自己申请的数据结构来代替函数栈,可以实现同样的功能。
①使用栈实现前序遍历:
- 申请一个栈stack,头结点入栈。
- 栈顶元素出栈,出栈元素的右节点和左节点依次入栈。
- 重复第二步,直到栈为空
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> orders;
stack<TreeNode*> nodes;
TreeNode* tmp;
if (root == NULL)
{
std::cerr << "The Tree is NULL !!!" << std::endl;
}
else
{
nodes.push(root);
while(nodes.empty()==0)
{
tmp = nodes.top();
nodes.pop();
orders.push_back(tmp->val);
if(tmp->right!=NULL)
nodes.push(tmp->right);
if(tmp->left!= NULL)
nodes.push(tmp->left);
}
}
return orders;
}
};
②使用栈实现中序遍历:
- 申请一个新的栈stack,定义一个变量 cur = root 节点
- cur入栈
- 令 cur = cur.left,重复步骤2,直到cur = NULL
- stack.pop(); 出栈的节点记为 node,输出 node.val
- 令 cur = node.right 重复2,3
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root)
{
vector<int> inorder;
TreeNode* cur = root;
if(root != NULL)
{
stack<TreeNode*> kk ;
while( !kk.empty() || cur != NULL)
{
if(cur != NULL)
{
kk.push(cur);
cur = cur->left;
}
else
{
cur = kk.top();
kk.pop();
inorder.push_back(cur->val);
cur = cur->right;
}
}
}
return inorder;
}
};
二 层次遍历
其实就是逐层遍历树的结构
广度优先搜索一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。
该算法从一个根节点开始,首先访问节点本身。
然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。
当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。
实现有两种模板
- 以层为单位输出
- 以节点为单位输出
按层为单位过程
- 头节点入队
- 如果队列不为空,取到队列的元素个数,得知上一个循环加入队列的元素个数,也就是上一层的元素个数。for循环令上一层的元素出队列,并把其左右子树入队。
核心:
就是 while 循环里面套一个 for 循环。
.
.
.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(root == NULL)
return ans;
queue<TreeNode*> q;
q.push(root);
while( !q.empty() )
{
int num = q.size();
vector<int> cur;
for (int i = 0 ; i < num; i++)
{
TreeNode* pnode = q.front();
q.pop();
if (pnode->left != NULL)
q.push(pnode->left);
if (pnode->right != NULL)
q.push(pnode->right);
cur.push_back(pnode->val);
}
ans.push_back(cur);
}
return ans;
}
};
LeetCode--二叉树1--树的遍历的更多相关文章
- [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- LeetCode总结 -- 树的遍历篇
遍历树的数据结构中最常见的操作. 能够说大部分关于树的题目都是环绕遍历进行变体来解决的. 一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历. 那么一般递归的解法就过于简单了. 面试官 ...
- LeetCode 107 Binary Tree Level Order Traversal II(二叉树的层级顺序遍历2)(*)
翻译 给定一个二叉树,返回从下往上遍历经过的每一个节点的值. 从左往右,从叶子到节点. 比如: 给定的二叉树是 {3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7 返回它从下 ...
- [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- Leetcode:1008. 先序遍历构造二叉树
Leetcode:1008. 先序遍历构造二叉树 Leetcode:1008. 先序遍历构造二叉树 思路 既然给了一个遍历结果让我们建树,那就是要需要前序中序建树咯~ 题目给的树是一颗BST树,说明中 ...
- [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
- [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历
Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...
- (PAT)L2-006 树的遍历 (二叉树构建)
题目链接:https://www.patest.cn/contests/gplt/L2-006 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格 ...
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...
- LeetCode(94):二叉树的中序遍历
Medium! 题目描述: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗 ...
随机推荐
- Solving ordinary differential equations I(nonstiff problems),exercise 1.1
Solve equation $y'=1-3x+y+x^2+xy$ with another initial value $y(0)=1$. Solve: We solve this by using ...
- binary-heap(二叉堆)原理及C++代码实现
二叉堆可以看做一个近似的完全二叉树,所以一般用数组来组织. 二叉堆可以分为两种形式:最大堆和最小堆.最大堆顾名思义,它的每个结点的值不能超过其父结点的值,因此堆中最大元素存放在根结点中.最小堆的组织方 ...
- 十四、linux-MySQL的数据库集群读写分离及高可用性、备份等
一.数据库集群及高可用性 二.mysql实现读写分离 mysql实现读写分离有多种方式: 1)代码语言(php\python\java等)层面实现读写分离,找开发进行实现. 2)通过软件工具实现读写分 ...
- 109)PHP与oracle网址
https://pecl.php.net/package/oci8/2.1.8/windowshttps://www.toadworld.com/platforms/oracle/w/wiki/116 ...
- VB.NET XOR 运算
C# 里面的 ^ 运算符,在VB.NET中可以用 XOR 表示,但是 byte x=(byte)(65535^254); 直接翻译成 dim x as Byte=CByte(65535 XOR 254 ...
- 奇点云数据中台技术汇(五)| CDP,线下零售顾客运营中台
顾客数据平台(Customer Data Platform,简称CDP),是近年兴起的一种以顾客为核心.聚焦客群细分与人群洞察的企业数据应用平台. 听上去很互联网啊?跟实体行业和零售营销有什么关系呢? ...
- 快速进入当前目录的cmd窗口
- linux下如何查看服务器的硬件配置信息
性能测试时一定要确定测试环境和的硬件配置.软件版本配置,保证和线上一致,才更接近真实环境. 那么linux下如何查看服务器的硬件配置信息?? 一.查看cpu信息 1.所有信息 lscpu [root@ ...
- [LC] 362. Design Hit Counter
Design a hit counter which counts the number of hits received in the past 5 minutes. Each function a ...
- HttpClient GET和POST请求
package com.rogue.hclient; import java.io.BufferedReader; import java.io.IOException; import java.io ...