前序遍历

leetcode 144. 二叉树的前序遍历

岁酱吖の 提交于 2019-12-06 12:55:19
给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 1 //迭代算法 2 class Solution { 3 public List<Integer> preorderTraversal(TreeNode root) { 4 Stack<TreeNode> stack = new Stack<TreeNode>(); 5 List<Integer> list = new ArrayList<Integer>(); 6 if(root==null)return list; 7 stack.push(root); 8 while(!stack.empty()){ 9 TreeNode tmpnode = stack.pop(); 10 list.add(tmpnode.val); 11 if(tmpnode.right!=null)stack.push(tmpnode.right); 12 if(tmpnode.left!=null)stack.push(tmpnode.left); 13 } 14 return list; 15 } 16 } 17 18 //递归算法 19 class Solution { 20 public List<Integer> preorderTraversal(TreeNode

二叉树的前中后序遍历

此生再无相见时 提交于 2019-12-06 09:48:27
面试题:二叉树的前中后序遍历 二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。前序遍历:前序遍历的顺序为根-左-右中序遍历:中序遍历的顺序为左-根-右后序遍历:后序遍历的顺序为左-右-根 1.前序遍历 思路:利用栈后进先出的特性。1.根结点入栈;2.循环取栈顶元素、右子结点入栈、左子结点入栈。JAVA参考代码public class TreeNode { int val; TreeNode left; TreeNode right;​ TreeNode(int val) { this.val = val; }}public List<Integer> preorderTree(TreeNode root) { Stack<TreeNode> stack = new Stack<>(); List<Integer> preorder = new ArrayList<>();​ if (root == null) { return preorder; }​ stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); preorder.add(node.val); if (node.right != null) { stack.push(node.right); } if (node

二叉树的迭代遍历以及递归遍历

痴心易碎 提交于 2019-12-06 05:08:14
二叉树的前序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } result.add(root.val); inOrder(root.left);+ inOrder(root.right); return result; } 二叉树的中序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } inOrder(root.left); result.add(root.val); inOrder(root.right); return result; } 二叉树的后续遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root =

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

雨燕双飞 提交于 2019-12-06 03:29:30
public class Solution { int i=0; public TreeNode reConstructBinaryTree(int [] pre,int [] in) { return constructBiTree(pre,in,0,pre.length-1); } public TreeNode constructBiTree(int pre[],int in[],int start,int end){ if(start>end) return null; TreeNode node = new TreeNode(pre[i]); int index=Location(pre[i],in); i++; if(i>=pre.length) return node; node.left=constructBiTree(pre,in,start,index-1); node.right=constructBiTree(pre,in,index+1,end); return node; } public int Location(int target,int in[]){ int i=0; for( i=0;i<in.length;i++){ if(target==in[i]) break; } return i; } } 来源: https://my.oschina

二叉树的前序遍历---迭代算法

旧街凉风 提交于 2019-12-06 03:23:31
二叉树的前序遍历   二叉树的前序遍历过程相当于先访问最左边路径上的所有节点,然后在从后往前访问各个节点的右子树, 因此应该想到要使用栈结构。访问当前的节点的同时将其右子树节点放入栈中等待访问。先序遍历的代码如 下: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; TreeNode* temp = root; // 当栈不为空或者root不为空节点时 while(!s.empty() || temp){ //`先遍历、访问、压栈左节点` while(temp){ s.push(temp); res.push_back(temp->val); temp = temp->left; } //当访问节点不存在左子树时,退栈对右子树进行访问 temp = s.top(); s.pop(); temp = temp->right; } return res; }   使用一个辅助栈的结构进行访问,访问当前的节点并将其右子树存入栈中,直到节点的左子树不存在时从栈中将节点取出,开始 迭代访问其右子树。 来源: https://www.cnblogs.com/wangkaia/p/11960183.html

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

别说谁变了你拦得住时间么 提交于 2019-12-05 20:15:53
20182333 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结 教材学习内容总结 图 与树类似,图由结点和这些结点之间的连接构成。 顶点(vertice):就是结点。 边(edge):就是这些结点连接起来的线段。 路径(path):图中的一系列边,每条边连通两个顶点。 路径的长度(length):是该路径中边的条数(或者是顶点数减去1)。 环路(cycle):一种首结点和末结点相同且没有重边的路径。没有环路的图称为无环的(acyclic)。 完全图(complete graph):含有最多条边的无向图 无向图 边没有方向的图称为无向图。 无向图中,表示边的顶点对是无序的,例如,标记顶点A,B,C,D,一条边可以表示为(A,B)。无向图表示顶点对是无序的,所以边(A,B)意味着A和B之间的连接是双向的,在一个无向图中,(A,B)和(B,A)所代表的边的含义完全一样。 含有最多条边的无向图称为完全图:Edges=(n-1)*n/2. 如果无向图中任意两个顶点间都有路径,则无向图称为连通的。 路径是连接图中两个顶点的边的序列,路径长度为路径所含边的数目(顶点个数减一) 第一个顶点和最后一个顶点是同一个顶点且没有重复边的路径,称为一个环。 如果图中两个顶点之间有边连接,则称这两个顶点是邻接的(邻居),自己连接到自己的边称为自循环或悬挂。 有向图

C++二叉树值创建于遍历二

一个人想着一个人 提交于 2019-12-05 14:33:39
#include <iostream> #include <cstdlib> #include<queue> #include <stack> using namespace std; //二叉树链表的存储结构 typedef struct BiTNode { int data;//节点数据 struct BiTNode *lchild, *rchild;//左右孩子指针 }BiTNode, *BiTree; //二叉树的建立 void CreatBiTree(BiTree &T) { int ch; cin >> ch; if (ch == 0) T = NULL; else { T = new BiTNode;//生成根节点 if (!T) exit(1); T->data = ch; CreatBiTree(T->lchild); //构造左子树 CreatBiTree(T->rchild); //构造右子树 } } //创建二叉树 BiTNode* create(int b[], int n) { BiTNode* ptree =new BiTNode [n]; int i; for (i = 0; i < n; i++) { ptree[i].data = b[i];//给每个节点赋值 ptree[i].lchild = NULL;// ptree[i].rchild =

leetcode105 从前序与中序遍历序列构造二叉树

旧街凉风 提交于 2019-12-05 09:52:58
如何遍历一棵树 有两种通用的遍历树的策略: 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。 深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为前序遍历,中序遍历和后序遍历。 public class Solution{ private int preIndex=0; private int[] preOrder; private int[] inOrder; Map<Integer,Integer> map=new HashMap<Integer,Integer>(); publice TreeNode bulidTree(in[] preOrder,int[] inOrder){ this.preOrder=preOrder; this.inOrder=inOrder; int idx=0; for(Integer s:inOrder){ map.put(s,idx++); } } private TreeNode helper(Int left,int right){ if(left==right){ return null; } int index=0; int root

二叉树的遍历

妖精的绣舞 提交于 2019-12-05 07:17:18
二叉树的遍历 二叉树的前序,中序,后序,层序遍历 package 剑指offer;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/** * @author WangXiaoeZhe * @Date: Created in 2019/11/22 18:11 * @description: */public class Main17 { public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } ArrayList<Integer> resultList = new ArrayList<>(); /** * 前序遍历:ABDEC * 1.首先遍历左子树,遍历到叶子结点为止 * @return * */ public boolean preorderTraverse(TreeNode node) { //首先从根节点开始遍历 resultList.add(node.val); if (node.left != null) { preorderTraverse(node.left); }

数据结构与算法之美学习笔记:第二十三讲

大憨熊 提交于 2019-12-05 00:21:43
一、课前思考 前面我们讲的都是线性表结构,栈、队列等等。今天我们讲一种非线性表结构,树。树这种数据结构牛逼线性表的数据结构要复杂得多,内容也比较多,所以我会分四节来讲解。 我反复强调过,带着问题学习,是最有效的学习方式之一,所以在正式的内容开始之前,我还是给你出几道思考题: 二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储? 带着这些问题,我们就来学习今天的内容,树! 二、树 1、一些节本概念 图中画了几棵“树”。你来看看,这些“树”都有什么特征? 你有没有发现,“树”这种数据结构真的很像我们现实生活中的“树”,这里面每个元素我们叫作“节点”;用来连线相邻节点之间的关系,我们叫作“父子关系”。 比如下面这幅图: A节点就是B节点的 父节点 ,B节点是A节点的 子节点 。 B、C、D这三个节点的父节点是同一个节点,所以它们之间互称为 兄弟节点 。 我们把没有父节点的节点叫作 根节点 ,也就是图中的节点E。 我们把没有子节点的节点叫作叶子节点或者 叶节点 ,比如图中的G、H、I、J、K、L都是叶子节点。 2、高度深度和层 除此之外,关于“树”,还有三个比较相似的概念:高度(Height)、深度(Depth)、层(Level)。它们的定义是这样的: 这三个概念的定义比较容易混淆,描述起来也比较空洞。我举个例子说明一下,你一看应该就能明白。 记这住个概念,我还有一个小窍们,就是类比