后序遍历

二叉树栈实现前中后序遍历(易理解的方法)

↘锁芯ラ 提交于 2019-12-29 19:32:47
说明:首先你需要看懂用栈实现中序遍历的代码,理解其思想: 从根节点开始入栈,找到他的左子树入栈.....一直到他的左子树为空了,左边到头了,取出当前根节点的值,从栈中取出当前根节点 然后找他的右子树继续入栈,找左子树入栈.....,直到右边取完了这时候一个节点就遍历完了,然后继续从栈中取上一个节点继续 其实考虑下为什么用栈呢?就是用他来回溯的要回溯到根节点,对于中序遍历:左中右,我按照右中左的顺序先后入栈里就可以了,然后每次循环取出栈顶节点也就是左子树作为根节点,取他的左右子树入栈,就可以了 实现: package com.bysj.common.算法; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class 二叉树 { static class ColorNode { TreeNode node; Boolean isContinue; public ColorNode(TreeNode node, Boolean isContinue) { this.node = node; this.isContinue = isContinue; } } public static List<Integer> inorderTraversal(TreeNode root)

二叉树前中后序遍历递归转循环

久未见 提交于 2019-12-29 17:44:47
通过观察递归实现,用循环和栈模拟递归实现中结点入栈和出栈的过程。 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl using namespace std; typedef long long LL; struct Node { int val; Node *left, *right; Node() : left(NULL), right(NULL) {} Node(int val) : val(val), left(NULL), right(NULL) {} }; enum StackState { AFTER_PUSH_ROOT = 0, AFTER_PUSH_LEFT = 1, AFTER_PUSH_RIGHT = 2, }; void dfs_pre_order(Node *root, vector<int> &ret) { ret.push_back(root->val); if (root->left) dfs_pre_order(root->left, ret); if (root->right) dfs_pre_order(root->right, ret); } void dfs_in_order(Node *root, vector<int> &ret) { if

二叉树遍历python

大憨熊 提交于 2019-12-25 13:45:32
二叉树遍历有先序遍历中序遍历和后序遍历 以下遍历以该二叉树为例: 3.1 前序遍历   思想:先访问根节点,再先序遍历左子树,然后再先序遍历右子树。总的来说是根—左—右   上图先序遍历结果为为:   代码如下: def PreOrder ( self , root ) : '''打印二叉树(先序)''' if root == None : return print ( root . val , end = ' ' ) self . PreOrder ( root . left ) self . PreOrder ( root . right ) 3.2 中序遍历   思想:先中序访问左子树,然后访问根,最后中序访问右子树。总的来说是左—根—右   上图中序遍历结果为为:   代码如下: def InOrder ( self , root ) : '''中序打印''' if root == None : return self . InOrder ( root . left ) print ( root . val , end = ' ' ) self . InOrder ( root . right ) 3.3 后序遍历   思想:先后序访问左子树,然后后序访问右子树,最后访问根。总的来说是左—右—根   上图后序遍历结果为为:   代码如下: def BacOrder (

数据结构和算法之二叉树

可紊 提交于 2019-12-25 07:09:26
一、为什么需要树这种数据结构 是因为之前的数组和链表两种存储结构对增删改查都各有利弊,而且差异明显。所以树这种结构就是增删改查效率差异不是很明显,增删改查所耗费时间都比较均衡的一种数据结构。 1、数组存储方式 1.1、优点 通过下标方式访问元素,速度快 。对于有序数组,还可以使用 二分查找 来提高检索速度。 1.2、缺点 若检索具体某个值,或 插入值(按一定顺序),会整体移动 。效率较低。 2、链表存储方式 2.1、优点 在一定程度上对数组存储方式进行了优化(比如插入一个节点,只需要将插入节点连接到链表中即可,删除效率也很好) 2.2、缺点 在进行检索时,效率仍然很低,比如检索某个值,需要从头节点开始遍历进行判断。 3、树存储方式 3.1、说明 可以利用 二叉排序树(Binary Sort Tree) ,既可以保证数据的检索速度,同时也可以保证数据的插入、删除、修改的速度。 二叉排序树就是要求任何 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2、案例 3.2.1、假设有一颗二叉排序树【8 4 11 2 6 10 13】,如下图所示 二叉排序树, 左侧 子节点的值都大于当前父节点, 右侧 子节点的值都小于当前父节点。 3.2.2、如下需求 3.2.2.1、查找10 具体步骤: 总共需要两次查找 1、判断10与根节点大小,大于根节点,在右侧查找 2

LeetCode 589. N叉树的前序遍历(N-ary Tree Preorder Traversal)

我是研究僧i 提交于 2019-12-24 17:53:27
589. N叉树的前序遍历 589. N-ary Tree Preorder Traversal LeetCode 589. N-ary Tree Preorder Traversal 题目描述 给定一个 N 叉树,返回其节点值的前序遍历。 例如,给定一个 3 叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗? Java 实现 Iterative Solution import java.util.LinkedList; import java.util.List; import java.util.Stack; class Node { public int val; public List<Node> children; public Node() { } public Node(int _val, List<Node> _children) { val = _val; children = _children; } } class Solution { public List<Integer> preorder(Node root) { List<Integer> result = new LinkedList<>(); if (root == null) { return result; } Stack<Node>

二叉搜索树的后序遍历序列

点点圈 提交于 2019-12-23 11:01:02
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 首先需要知道,二叉搜索树的特点是,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。后序遍历是按照左——右——根的顺序进行遍历的。所以这道题的大体思路是,根据左子树小于根节点的特点,找到左子树的分界点,然后从右子树开始,看是不是所有的值都大于根节点,如果出现小于根节点的情况,说明不符合要求。然后对左子树 (l, k-1) 和右子树 (k, r-1) 进行递归。当 l >= r 时,说明判断完成,可以返回true。 还有要注意特判一下数组是否为空,如果为空,直接返回false。 c++代码如下: 1 class Solution { 2 public: 3 vector<int> seq; 4 bool VerifySquenceOfBST(vector<int> sequence) { 5 seq = sequence; 6 if(seq.empty()) return false; 7 return dfs(0, seq.size() - 1); 8 } 9 10 bool dfs(int l, int r){ 11 if(l >= r) return true; 12 int k = l; 13 while

23.二叉树的后序遍历序列

戏子无情 提交于 2019-12-23 05:37:41
layout: post post title: 23.二叉树的后序遍历序列 date: 2019-11-08 19:52:44 categories: 剑指offer tags: 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 思路 定义:二叉排序树 ( Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树。. 若它的左子树不空,则左子树上所有结点的值均小于它的根结构的值 若它的右子树不空 ,则右子树上所有结点的值均大于宫的根结点的值 它的左、右子树也分别为二叉排序树。 代码 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0) return false; return _VerifySquenceOfBST(sequence,0,sequence.size()-1); } bool _VerifySquenceOfBST(vector<int> s,int start,int end) { if(start>=end) return true; int root=s[end]; int i

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系

【LeetCode】二叉树的后序遍历

妖精的绣舞 提交于 2019-12-21 20:19:21
递归思想实现二叉树的后序遍历 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { List<Integer> list = new ArrayList<Integer>(); public List<Integer> postorderTraversal(TreeNode root) { if (root == null) { return list; } postorderTraversal(root.left); postorderTraversal(root.right); list.add(root.val); return list; } } 非递归思想实现后序遍历 (借助于LinkedList实现,针对每一个处理节点,将左右节点放入nodeList,每次处理的时候处理最后一个元素即树某节点的右节点,然后使用头插插入结果中) /** * Definition for a binary tree node. * public class TreeNode { * int val; *

二叉树的链式实现

↘锁芯ラ 提交于 2019-12-21 07:21:22
相关术语: 平衡树,非平衡树,完全数,满树。 实现策略: 1)数组实现 这个还是非常重要的,有时间写一下,先用链来写 元素n的(从0开始按层编号)左子树编号为2n+1,右子树编号为2n+2,数学证明就略了,用这个来控制下标 2)模拟链式实现 3)链式实现 树是一种非线性结构,那么跟前不一样,必须根据你的需求 来构造新的节点才能满足树中的节点特征 : package Tree;public class BinaryTreeNode { protected Object element; protected BinaryTreeNode left,right; public BinaryTreeNode(Object element)//用元素来构造一个结点 { this.element = element; left = null; right = null; } public int numChildren(){//返回结点的子树上结点的个数 int count = 0; if(left != null) count = 1 + left.numChildren(); if(right != null) count = count + 1 + right.numChildren(); return count; } } 下面是一个实现了一些基本操作的二叉树的ADT