二叉树遍历

LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal

倾然丶 夕夏残阳落幕 提交于 2019-11-28 00:22:58
题目: 给定一个二叉树,返回它的 中序 遍历。 Given a binary tree, return the inorder traversal of its nodes' values. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? Follow up: Recursive solution is trivial, could you do it iteratively? 解题思路: 百度百科:二叉树的中序遍历: https://baike.baidu.com/item/中序遍历 遍历顺序:左子节点 --> 根节点 --> 右子节点 如下所示的二叉树: A / \ B C / \ / \ D E F G 其遍历顺序为:D -> B -> E -> A ->F -> C -> G 二叉树遍历可以用 DFS(深度优先搜索)完成,其实现方式为:递归或借助数据结构 栈 迭代。 这种遍历方式本质上是一个先进后出的栈式遍历方式,递归方法实际也是用递归方式实现栈的先进后出。 DFS-递归: Java: class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new

102-二叉树层次遍历

余生颓废 提交于 2019-11-27 19:23:28
题目:按层输出二叉树,每层一行 def levelOrder(root): if not root: return [] queue,res = [],[] queue.append(root) while queue: level_size = len(queue) current_level = [] for _ in range(level_size): node = queue.pop(0) if node.left: queue.append(node.left) if node.rirht: queue.append(node.rirht) current_level.append(node.val) res.append(current_level) return res 注: 使用队列,这里是每层一行,需要再设置一个变量,用来存储每层的节点。当前队列的所有元素即为现层二叉树的所有节点。 来源: https://www.cnblogs.com/kingshine007/p/11374063.html

20182311 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

那年仲夏 提交于 2019-11-27 16:58:10
目录 教材学习内容总结 教材第15章 教材第16章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周错题总结 点评过的同学博客和代码 学习进度条 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 教材第15章 树的概述 定义:树是一种非线性结果,元素按分层组织。它含有结点和连接结点的边,位于树最高层的是根节点root,结点相对于根节点的位置表示结点的层。树中不含有子节点的结点为叶结点,除叶结点和根结点外的其他结点都是内节点。 树的阶:结点含有的最大子结点数。 路径长度:连接两个结点边的数量。高度:从根结点到叶结点的最长路径的长度。 n元树:任一结点的子节点数目不多于n的 平衡:所有叶结点都位于同一层 完全:树平衡,且最底层的叶结点都在树的左边 树的实现: 数组实现策略:使用数组实现树,数组下标为n的结点的左子树下标为2n,右子树下标为2n+1。思路简单,访问迅速,但是该数组会为不含数据的树位置分配空间,浪费存储空间。 模拟连接策略:在数组中存入孩子的数组索引,为了节省空间会增加删除树中元素时,数组元素进行移位的成本。 链表实现:链表是最常见的造树方法,二叉链表可连接左右节点,三叉链表可指向父节点,多叉链表可以指向更上一级或者siblings 树的遍历:递归遍历比非递归遍历更简单

二叉树先序、中序、后序、层次遍历递归以及非递归算法实现

ぐ巨炮叔叔 提交于 2019-11-27 15:59:52
最近写了一下关于二叉树的三种遍历算法的递归以及非递归实现,以及层次遍历算法实现 先序遍历递归实现 /** * 先序遍历,根》左》右 */ public void beforeTraverse ( TreeNode root ) { if ( root == null ) { return ; } System . out . print ( root . val + "->" ) ; if ( root . left != null ) { beforeTraverse ( root . left ) ; } if ( root . right != null ) { beforeTraverse ( root . right ) ; } } 先序遍历非递归实现 /** * 通过栈遍历二叉树,先序(思想就是:入栈即记录) */ public List < String > beforeTraverseByStack ( TreeNode root ) { List < String > list = new ArrayList < > ( ) ; // 接受结果 if ( root == null ) { return list ; } Stack < TreeNode > stack = new Stack < > ( ) ; // 先序遍历(根 》左 》右),先遍历所有左结点

二叉树的遍历

妖精的绣舞 提交于 2019-11-27 07:46:46
二叉树的遍历是指通过一定的顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历和层次遍历,其中,前三种一般使用深度优先搜索(DFS)实现,而层次遍历一般使用广度优先搜索(BFS)实现 把一颗二叉树分为三个部分:根节点、左子树、右子树,且对左子树和右子树可以同样进行这样的划分,这样对树的遍历就可以分为对这三个部分的遍历,这三种方法中,左子树一定要先于右子树遍历,且所谓的“先中后”都是指根节点root在遍历中的位置,因此先序遍历的访问顺序是根节点-左子树-右子树;中序遍历的访问顺序是左子树-根节点-右子树;后序遍历的访问顺序是左子树-右子树-根节点。 先序遍历 1、先序遍历的实现 对先序遍历来说,总是先访问根节点root,再访问左子树和右子树,因此先序遍历的顺序是根节点-左子树-右子树 为了实现递归的先序遍历,需要得到两样东西:递归式和递归边界。其中递归式已经可以由先序遍历直接得到,即先访问根节点(可以做任何事情),再递归访问左子树,最后递归访问右子树,递归边界就是子树为空 先序遍历的代码如下: void preorder(node *root){ if(root==NULL){ //到达空树,递归边界 return; } //访问根节点root,例如将其数据域输出 printf("%d\n",root->data); //访问左子树 preorder(root-

先序+中序遍历重建二叉树

梦想与她 提交于 2019-11-27 07:46:43
假设已知先序序列为pre1,pre2,pre3……pren,中序序列为in1,in2,in3,……,inn,如图所示,那么由先序序列的性质可知,先序序列的第一个元素pre1是当前二叉树的根节点,再由中序序列的性质可知,当前二叉树的根节点将中序序列划分为左子树和右子树。因此,要做的就是在中序序列中找到某个结点ink,使的ink==pre1,这样就在中序序列中找到了根节点。易知左子树的结点个数是numleft=k-1.于是,左子树的先序序列区间就是[2,k],左子树的中序序列区间就是[1,k-1];右子树的先序序列区间就是[2,k],右子树的中序序列区间是[k+1,n],接着只需要在左子树和右子树上进行递归重建二叉树即可。 事实上,如果递归过程中当前序列的区间为[prel,prer],中序序列的区间为[inl.inr],那么左子树的结点个数为numleft=k-inl.这样左子树的先序序列区间为[prel+1,prel+numleft],左子树的中序序列区间为[inl,k-1];右子树的先序序列区间为[prel+numleft+1,prer],右子树的中序序列区间为[k+1,inr]; 那么,如果一直这样递归下去,什么时候结束呢?问题的答案是显然的,因为只要先序序列的长度小于等于0时,当前二叉树就不存在了,以此作为递归的边界。 代码如下: //当前先序序列的区间为[prel,prer]

LeetCode 965. 单值二叉树 (遍历二叉树)

老子叫甜甜 提交于 2019-11-27 03:14:39
题目链接: https://leetcode-cn.com/problems/univalued-binary-tree/ 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1,1,1,null,1] 输出:true 示例 2: 输入:[2,2,2,5,2] 输出:false 提示: 给定树的节点数范围是 [1, 100]。 每个节点的值都是整数,范围为 [0, 99] 。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 bool isUnivalTree(struct TreeNode* root){ 11 if(root==NULL) return true; 12 if(root->left!=NULL&&root->val!=root->left->val) return false; 13 if(root->right!=NULL&&root->val!=root->right->val) return

二叉树的三种遍历方式

≡放荡痞女 提交于 2019-11-27 02:27:44
二叉树的遍历是图论中学到知识,分别有三种遍历方式:前序中序后序,假设根节点是a,左节点是b,右节点是c,那么前序遍历是abc,中序遍历是bac,后序遍历是bca;这样看的话就比较好理解这三种遍历了。 来源: https://www.cnblogs.com/wyx66688/p/11338208.html

二叉树的创建与3种遍历详讲

大憨熊 提交于 2019-11-27 02:26:05
二叉树是一种特殊的树,二叉树是n(n>=0)个结点的有限集合,该集合或者为空集,或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成. 二叉树性质: 在二叉树的第i层最多有2^(i-1)个结点 (i>=1) 深度为k的二叉树至多有2^k -1 个结点 ( k>=1) 对任意一颗二叉树T,如果其终点结点数为n0,度为2的结点数为n2,则n0=n2+1; 如果一颗有n个结点的完全二叉树的结点按层序编号,对任一结点i(1<=i<=n) 有: 1.如果i=1,则结点i是二叉树的根,无双亲,如果i>1则其双亲是结点i/2向下取整 如果n<2i 则结点i无左孩子,否者其左孩子是结点2i 如果n<2i+1,则结点i无右孩子,否则其右孩子是结点2i+1. 下面是二叉树的定义代码 typedef struct TreeNode { char data; struct TreeNode * lchild; struct TreeNode * rchild; }TreeNode,*Tree; 二叉树的建立 void CreateTree(Tree * pte) { char ch; scanf("%c", &ch); if (ch == '#') { *pte = (TreeNode*)malloc(sizeof(TreeNode)); if (!*pte) exit(1); (

PTA L2-006 树的遍历 (25 分)

╄→гoц情女王★ 提交于 2019-11-27 01:31:42
题目描述: 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 解题思路: 这题是给定后序和中序的遍历,可以通过后序确定根节点,在通过根节点将中序分为左子树和右子树和根节点,然后通过左子树和右子树可以将后序也分成左子树和右子树和根节点,然后其实就是重复这个过程来建树,最后层序遍历用广搜就行了 AC代码: #include <iostream> #include<stdio.h> using namespace std; int tree[5000]; int a; void gettree(int b[500],int c[500],int num,int tb,int tc) { if(tb==0||tc==0) { return; } int b1[35]; int c1[35]; int tb1=0; int tc1=0; int n=0; for(n=0;n<tc;n++) { if(c