中序遍历

[leetcode] 94. 二叉树的中序遍历

旧街凉风 提交于 2020-02-09 07:47:36
94. 二叉树的中序遍历 中序遍历 递归写法 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if (root == null) return list; dfs(root, list); return list; } public void dfs(TreeNode node, List<Integer> ans) { if (node.left != null) dfs(node.left, ans); ans.add(node.val); if (node.right != null) dfs(node.right, ans); } } 非递归写法 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if (root == null) return list; Stack<TreeNode> stack = new Stack<>(); while (!stack.isEmpty() || root != null) { while

数据结构(三)——二叉树的相关操作

亡梦爱人 提交于 2020-02-09 03:29:59
前言 这里同样不介绍二叉树的相关概念,毕竟数据结构的基础已经讲过很多了,这里不再赘述。至于一些平衡二叉树,完全二叉树,红黑树,B+树等相关结构,这个已经有很多博客介绍了,这里只是介绍一下二叉树的一些基础操作。 定义 这个应该见过多次 /** * autor:liman * createtime:2020/2/6 * comment:二叉树节点的实现 */ public class TreeNode { public String value ; public TreeNode left ; public TreeNode right ; public TreeNode ( String value ) { this . value = value ; } } 遍历的非递归实现 递归的实现非常简单,估计很多人都会,这里就介绍非递归的遍历实现 基本的遍历操作如下:这里示意的输出一下表示遍历操作 /** * 做遍历的操作。 * * @param node */ public static void doTraverse ( TreeNode node ) { System . out . print ( node . value + " " ) ; } 先序遍历 /** * 非递归实现的先序遍历,这里用到了栈的操作 * * @param root */ public static

递归遍历二叉树

时间秒杀一切 提交于 2020-02-09 00:23:27
#二叉树结点 class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None #二叉树类,创建二叉树和遍历二叉树 class BinaryTree(object): def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self.CreateBinaryTree(Root.RightChild) def PreOrder(self,Root): if Root is not None: self.VisitBinaryTreeNode(Root) self.PreOrder(Root.LeftChild) self.PreOrder(Root.RightChild) def InOrder(self,Root): if Root is not None: self.InOrder(Root

非递归遍历二叉树

旧城冷巷雨未停 提交于 2020-02-08 23:06:54
#类名称:BinaryTreeNode #类说明:定义一个二叉树的结点 #类释义:分别有左孩子LeftChild,右孩子RightChild和数据data class BinaryTreeNode(object): def __init__(self): self.data='#' self.LeftChild=None self.RightChild=None class TreeState(object): def __init__(self,BinaryTreeNode,VisitedFlag): self.BinaryTreeNode = BinaryTreeNode self.VisitedFlag = VisitedFlag #类说明:定义一个二叉树 class BinaryTreeNonRecursive(BinaryTreeNode): #创建二叉树的函数 def CreateBinaryTree(self,Root): data=input('->') if data=='#': Root=None else: Root.data=data Root.LeftChild=BinaryTreeNode() self.CreateBinaryTree(Root.LeftChild) Root.RightChild=BinaryTreeNode() self

数据结构——二叉树的遍历(c/c++)

给你一囗甜甜゛ 提交于 2020-02-08 19:12:10
递归遍历: 二叉树的三种递归遍历为先序遍历,中序遍历和后续遍历。它们相似之处在于都是对二叉树的递归遍历且对任何一个结点都经过三次,区别在于哪一次对该结点进行访问,由此分为先,中,后序遍历。所以对于任一结点都有:三次经过,一次访问。 先序遍历: void preorder(btNode* p) { if (p != NULL) { visit(p); preorder(p->lc); preorder(p->rc); } } 中序遍历: void inorder(btNode* p) { if (p != NULL) { inorder(p->lc); visit(p); inorder(p->rc); } } 后序遍历: void postorder(btNode* p) { if (p != NULL) { postorder(p->lc); postorder(p->rc); visit(p); } } 对于下图中的树: 先序遍历结果为:ABDECF 根 左 右 中序遍历结果为:DBEAFC 左 根 右 后序遍历结果为:DEBFCA 左 右 根 中序与先(后)序可唯一确定一颗二叉树。 层序遍历: 二叉树的层序遍历的实现思路:建立一个辅助数据结构队列,将二叉树头节点入队,在出队时将其左右孩子挨个入队,每出队一个结点,将其左右孩子入队,直至队列为空。 void level

非线性数据结构——树

微笑、不失礼 提交于 2020-02-08 16:52:52
树 非线性数据结构定义:也就是每个元素可以有多个前驱和后继。树是一种非线性结构。它可以有两种定义。 第一种:树是n(n>=0, n为0时,称为空树 )个元素的集合,它只有 一个特殊的没有前驱的元素 ,这个元素成为树的 根(root) ,而且 树中除了根节点外,其余的元素都只能有一个前驱,可以有0个或者多个后继。 第二种递归定义:树T是n(n>=0,n为0时,称为空树)个元素的集合,它有且只有一个特殊元素根,剩余元素都可以被划分为M个互不相交的集合T1,T2,T3……、Tm,而每一个集合都是树,称为T的子树subtree,同时,子树也有自己的根。 维基百科是这样定义的: 树中的概念 结点: 树中的数据元素,也就是上图中的,A,B,C,D,E,F,G…… 结点的度degree :节点拥有的子树的数目称为度,记作d(v)。 叶子结结: 节点的度为0,称为叶子节点leaf,终端节点,末端节点。 分支结点: 节点的度不为0,称为非终端节点或分支节点。 分支: 节点之间的关系。 内部节点: 除根节点外的分支节点,当然也不包括叶子节点。 树的度: 树内各节点的度的最大值,比如下面这个图D节点的度最大为3,所以树的度数就是3. 孩子(儿子child)节点: 节点的子树的根节点成为该节点的孩子。 双亲(父parent)节点: 一个节点是他各子树的根节点的双亲。 兄弟(sibling)节点:

剑指offer (62)

≯℡__Kan透↙ 提交于 2020-02-08 12:28:09
题目 : 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 思路 : 二叉搜索树的中序遍历就是从小到大排序,所以只要找到中序遍历的第K个节点即可;可以使用链表存储节点,要注意边界条件,K可能不是个有效值 import java . util . ArrayList ; import java . util . Arrays ; public class Solution { static TreeNode root = null ; ArrayList < TreeNode > list = new ArrayList < > ( ) ; // 寻找倒数第k小的节点 TreeNode kminNode ( TreeNode root , int k ) { inOrder ( root ) ; if ( k > 0 && list . size ( ) >= k ) { return list . get ( k - 1 ) ; } else return null ; } // 根据中序遍历将数值存进一个链表 public void inOrderLink ( TreeNode root ) { if ( root == null ) { return ; } inOrder ( root .

数据结构之二叉树遍历

允我心安 提交于 2020-02-07 15:50:32
一、树的遍历操作 树的遍历:从根节点出发,按照某种次序访问树中所有结点,使得每个结点被访问一次且仅被访问一次。 遍历的实质为将树结构(非线性结构)转换为线性结构。 树通常有前序(根)遍历、后序(根)遍历和层序(次)遍历三种方式。 前序遍历: 树的前序遍历操作定义为: 若树为空,则空操作返回; 否则 (1)访问根结点;   (2)按照从左到右的顺序前序遍历根结点的每一棵子树 图中树的前序遍历序列为:A B D E H I F C G 树的后序遍历操作定义为: 若树为空,则空操作返回; 否则 ⑴ 按照从左到右的顺序后序遍历根结点的每一棵子树; ⑵ 访问根结点。 图中树的后序遍历序列: D H I E F B G C A 树的层序遍历操作定义为: 从树的第一层(即根结点)开始,自上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。 图中树的层序遍历序列: A B C D E F G H I 二、二叉树的遍历操作 前序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①访问根结点; ②前序遍历根结点的左子树; ③前序遍历根结点的右子树。 图中二叉树的前序遍历序列:A B D G C E F 中序(根)遍历: 若二叉树为空,则空操作返回; 否则: ①中序遍历根结点的左子树; ②访问根结点; ③中序遍历根结点的右子树。 图中二叉树的中序遍历序列:D G B A E C F 后序(根

二叉树的代码实现 JAVA 版本

こ雲淡風輕ζ 提交于 2020-02-07 13:14:22
本文主要实现二叉树的简单功能: (1)二叉树的生成 (2)二叉树的遍历:前序遍历,中序遍历,后序遍历,层次遍历 (3)二叉树的删除 (3)判断节点是否存在的功能 package ds.tree; import ds.link.Node; import java.util.LinkedList; import java.util.Queue; /** * @author : cuantianhou 2019/12/17 */ public class BinaryTree <T extends Comparable<T>>{ private Node<T> root; private int capacity = 0; public T insert(T data){ /** * Step1: 如果该节点为空,将该节点设置为根节点,父节点为空,返回出入值 * * */ capacity++; if(root == null) { root = new Node<T>(data,null); return root.data; } /** * Step2:从根节点遍历,插入节点比当前节点小,把当前节点设置为左子节点,然后与左子比较, * 插入节点比当前节点大,把当前节点设置为右子节点,然后与右子比较,插入节点和当前节点相等 * 覆盖并返回当前值 **/ //父节点 Node<T>

【Python数据结构与算法笔记day36】7.2. 二叉树的遍历+深度优先遍历+ 广度优先遍历(层次遍历)

吃可爱长大的小学妹 提交于 2020-02-07 10:36:43
文章目录 7.2. 二叉树的遍历 二叉树的遍历 深度优先遍历 广度优先遍历(层次遍历) 7.2. 二叉树的遍历 二叉树的遍历 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历, 深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。 深度优先遍历 对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。 那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树 根节点->左子树->右子树 def preorder ( self , root ) : """递归实现先序遍历""" if root == None : return print root . elem self . preorder (