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);
      }  
  }
};

② 用非递归的方式遍历二叉树

用递归方式实现的问题都可以用非递归方法实现。

递归的本质就是利用函数栈来保存信息。

用自己申请的数据结构来代替函数栈,可以实现同样的功能。

①使用栈实现前序遍历:
  1. 申请一个栈stack,头结点入栈。
  2. 栈顶元素出栈,出栈元素的右节点和左节点依次入栈。
  3. 重复第二步,直到栈为空
/**
* 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;
  }
};
②使用栈实现中序遍历:
  1. 申请一个新的栈stack,定义一个变量 cur = root 节点
  2. cur入栈
  3. 令 cur = cur.left,重复步骤2,直到cur = NULL
  4. stack.pop(); 出栈的节点记为 node,输出 node.val
  5. 令 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;
}
};

二 层次遍历

其实就是逐层遍历树的结构

广度优先搜索一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。

该算法从一个根节点开始,首先访问节点本身。

然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。

当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。

实现有两种模板
  1. 以层为单位输出
  2. 以节点为单位输出
按层为单位过程
  1. 头节点入队
  2. 如果队列不为空,取到队列的元素个数,得知上一个循环加入队列的元素个数,也就是上一层的元素个数。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--树的遍历的更多相关文章

  1. [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  2. LeetCode总结 -- 树的遍历篇

    遍历树的数据结构中最常见的操作. 能够说大部分关于树的题目都是环绕遍历进行变体来解决的. 一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历. 那么一般递归的解法就过于简单了. 面试官 ...

  3. LeetCode 107 Binary Tree Level Order Traversal II(二叉树的层级顺序遍历2)(*)

    翻译 给定一个二叉树,返回从下往上遍历经过的每一个节点的值. 从左往右,从叶子到节点. 比如: 给定的二叉树是 {3,9,20,#,#,15,7}, 3 / \ 9 20 / \ 15 7 返回它从下 ...

  4. [LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  5. Leetcode:1008. 先序遍历构造二叉树

    Leetcode:1008. 先序遍历构造二叉树 Leetcode:1008. 先序遍历构造二叉树 思路 既然给了一个遍历结果让我们建树,那就是要需要前序中序建树咯~ 题目给的树是一颗BST树,说明中 ...

  6. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  7. [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历

    Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binary tr ...

  8. (PAT)L2-006 树的遍历 (二叉树构建)

    题目链接:https://www.patest.cn/contests/gplt/L2-006 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格 ...

  9. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  10. LeetCode(94):二叉树的中序遍历

    Medium! 题目描述: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗 ...

随机推荐

  1. 在Orcl中通过SQL语句修改创建表

    1.创建表时定义唯一性约束 CREATE TABLE table_name ( column1 datatype null/not null, column2 datatype null/not nu ...

  2. 基于STC89C516的多游戏实现

    所用器件:STC89C516,矩阵键盘,LCD1602,16*16点阵,74HC595,无源蜂鸣器,晶振为11.0592MHZ 使用说明: 开机(复位)进入启动界面,1602显示Welcome.500 ...

  3. TreeMap简介

    在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一.与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序.其中,可以使用 ...

  4. python学习笔记(2)数据类型-字符串

    字符串是 Python 中最常用的数据类型.我们可以使用引号( ' 或 " )来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' ...

  5. Java IO: FileReader和FileWriter

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍FileReader和FileWriter.与FileInputStream和File ...

  6. [LC] 64. Minimum Path Sum

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  7. Hadoop伪分布式HDFS环境搭建和使用

    1.环境要求 Java版本不低于Hadoop要求,并配置环境变量 2.安装 1)在网站hadoop.apache.org下载稳定版本的Hadoop包 2)解压压缩包 检查Hadoop是否可用 hado ...

  8. 使用Hangfire MVC 做排程

    Greg Yang Developer Taipei, Taiwan 108 POSTS 35 TAGS 所使用的是 Hangfire 強大排程器有 UI介面可以使用. 首先安裝PM> Inst ...

  9. 吴裕雄--天生自然HTML学习笔记:HTML 表格

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Android开发之《Module相互引用,NDK不能正常Debug》

    解决Android Studio不能进入调试模式问题 Android Studio 2.2.3 native debug 无法调试?:https://www.zhihu.com/question/54 ...