二叉树遍历

顺序存储二叉树的遍历

我们两清 提交于 2020-03-07 02:46:00
顺序存储二叉树一个结点下标为n,则其左结点的下标为2*n+1,右结点下标为2*n+2,一个结点的父结点下标为(n-1)/2,因此可以利用递归很容易的写出其遍历方式,这里给出前序遍历示例: //顺序存储二叉树前遍历 public class ArrBinaryTreeDemo { public static void main ( String [ ] args ) { int [ ] arr = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ; ArrBinaryTree arrBinaryTree = new ArrBinaryTree ( arr ) ; arrBinaryTree . preOrder ( ) ; } } class ArrBinaryTree { private int [ ] arr ; public ArrBinaryTree ( int [ ] arr ) { this . arr = arr ; } // index表示数组的下标 public void preOrder ( int index ) { // 如果数组为空,或者arr.length=0 if ( arr == null || arr . length == 0 ) { System . out . println ( "数组为空,不能按照二叉树的前序遍历" ) ; }

二叉树遍历的递归与非递归实现(python)

只愿长相守 提交于 2020-03-05 16:32:31
最近在刷leetcode时,刷到了二叉树中序遍历的题目,所以特在此记录一下,下面我将给出中序遍历的递归实现和非递归(迭代)实现的代码与算法思想: 1. 中序遍历的递归实现: 1 class TreeNode(object): 2 def __init__(self, x): 3 self.val = x # 节点存储的值 4 self.left = None # 左子节点 5 self.right = None # 右子节点 6 7 class solution: 8 def __init__(self): 9 self.__result_list = list() # 存放中序遍历结果的集合 10 def inorder_traversal(self, root : TreeNode) -> list: 11 if root == None: return # 判断节点是否为空 12 self.inorder_traversal(root.left) # 递归遍历左子树 13 self.__result_list.append(root.val) # 将节点的值存放到集合中 14 self.inorder_traversal(root.right) # 递归遍历右子树 15 return self.__result_list # 返回集合 递归实现的算法思想:先中序遍历左子树

原生JS实现二叉搜索树(Binary Search Tree)

久未见 提交于 2020-03-05 09:53:30
1.简述 二叉搜索树树(Binary Search Tree) ,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 2.代码说明 首先先创建一个辅助节点类Node,它初始化了三个属性:节点值,左孩子,有孩子。 class Node { constructor(value) { this.value = value; this.left = null; this.right = null; } } 接着创建一个二叉搜索树类BST,它初始化了根节点为null。 class BST { constructor() { this.root = null; } } 然后,给这个BST类声明一些方法: insert(value):向树中插入一个节点值为value的节点。 midOrderTraverse(callback):中序遍历树,并将树中的每个节点传入callback回调函数里。 preOrderTraverse(callback):前序遍历树,并将树中的每个节点传入callback回调函数里。 lastOrderTraverse(callback):后序遍历树,并将树中的每个节点传入callback回调函数里。

alicode35

匆匆过客 提交于 2020-03-05 06:37:37
1 package solution35; 2 3 import java.util.LinkedList; 4 5 public class Solution { 6 public LinkedList<Integer> list = new LinkedList<Integer>(); 7 public void inOrder(TreeNode root){ 8 if(root != null){ 9 if(root.left != null){ 10 inOrder(root.left); 11 } 12 this.list.add(root.val); 13 if(root.right != null){ 14 inOrder(root.right); 15 } 16 } 17 18 } 19 public int solution(TreeNode root) { 20 this.inOrder(root); 21 int n = list.size(); 22 return list.get(n-2); 23 } 24 } 算法思路:二叉树遍历(中序遍历)。 二叉搜索树的中序遍历是有序的。 来源: https://www.cnblogs.com/asenyang/p/12418159.html

二叉树(1)

倖福魔咒の 提交于 2020-03-04 14:12:19
二叉树的前序遍历 采用递归的方式可以很快得到结果,中序遍历和后序遍历与该算法几乎一样,只是有几行代码的位置换一换。 前序遍历: 先保存根节点的值,然后再去遍历左子树,然后遍历右子树。因此,添加结点值的代码在遍历左子树和右子树的结点的上面。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List < Integer > preorderTraversal ( TreeNode root ) { List < Integer > list = new ArrayList < > ( ) ; if ( root == null ) return list ; preorderFunction ( root , list ) ; return list ; } void preorderFunction ( TreeNode root , List < Integer > list ) { if ( root == null ) return ; list . add ( root .

二叉树图解以及二叉树的递归原理

帅比萌擦擦* 提交于 2020-03-03 20:46:18
递归(recursion) 又称递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 构成递归需具备的条件: 1. 子问题须与原始问题为同样的事,且更为简单; 2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 代码取自美国课本 "Java How to Program "(Deitel & Detel)的练习: 20.25。 以中序遍历递归方法为例,这里显示的图解,仅诠释开始一小部分递归前进段与递归返回段的交叉过程。通过这一小段的繁琐解释,希望读者可见到二叉树递归遍历的端倪。 private void inorderHelper( TreeNode node ){ if ( node == null ) //若节点为空 return; //无任何操作 inorderHelper( node.leftNode ); //有序遍历下一级左子树 System.out.print( node.data + " " ); //输出节点数据 inorderHelper( node.rightNode );//有序遍历下一级右子树 } 插图说明: 前进段的进程 1 :鉴于以树根 节点 "49" 为参数,调用 inorderHelper(...)

PYTHON数据结构与算法学习笔记(六)

[亡魂溺海] 提交于 2020-03-03 02:52:56
目录 树与树算法 树的概念 树的存储与表示 二叉树 二叉树的性质 二叉树的创建 二叉树的遍历 广度优先遍历(层次遍历) 深度优先遍历 树与树算法 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1、每个节点有零个或多个子节点; 2、没有父节点的节点称为根节点; 3、每一个非根节点有且只有一个父节点; 4、除了根节点外,每个子节点可以分为多个不相交的子树。 例 : 树的术语 1、 节点的度 :一个节点含有的子树的个数称为该节点的度; 2、 树的度 :一棵树中,最大的节点的度称为树的度; 3、 叶节点或终端节点 :度为零的节点; 4、 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 5、 子节点 :一个节点含有的子树的根节点称为该节点的子节点; 6、 兄弟节点 :具有相同父节点的节点互称为兄弟节点; 7、 节点的层次 :从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 8、 树的高度或深度 :树中节点的最大层次; 9、 堂兄弟节点 :父节点在同一层的节点互为堂兄弟; 10、 节点的祖先 :从根到该节点所经分支上的所有节点;

数据结构-二叉树的层次遍历18

纵然是瞬间 提交于 2020-03-03 00:21:17
二叉树的层次遍历 之前我已经讲解过了二叉树的先序遍历,中序遍历、后序遍历今天来看一个层次遍历,就以下面的树为例子吧,层次遍历就是一层一层的遍历,下图的层次遍历的结果是1,2,3,4,5,6,7那就看代码吧! # include <iostream> # include <queue> using namespace std ; typedef struct BiTNode { int data ; struct BiTNode * lchild , * rchild ; //左孩子 右孩子 } BiTNode , * BiTree ; void cengcibianli ( BiTNode * T , queue < BiTNode * > & m_que ) { if ( T ) { m_que . push ( T ) ; } BiTNode * temp { nullptr } ; while ( ! m_que . empty ( ) ) { temp = m_que . front ( ) ; m_que . pop ( ) ; if ( temp ) { printf ( "%d " , temp -> data ) ; m_que . push ( temp -> lchild ) ; m_que . push ( temp -> rchild ) ; } } }

二叉树的前序遍历、中序遍历和后序遍历

女生的网名这么多〃 提交于 2020-03-02 11:51:58
public class BinaryTreeDemo { public static void main ( String [ ] args ) { BinaryTree binaryTree = new BinaryTree ( ) ; HeroNode root = new HeroNode ( "宋江" , 1 ) ; HeroNode hero2 = new HeroNode ( "无用" , 2 ) ; HeroNode hero3 = new HeroNode ( "卢俊义" , 3 ) ; HeroNode hero4 = new HeroNode ( "林冲" , 4 ) ; //说明,我们先手动创建二叉树,后面我们学习递归的方式创建二叉树 root . setLeft ( hero2 ) ; root . setRight ( hero3 ) ; hero3 . setRight ( hero4 ) ; binaryTree . setRoot ( root ) ; //前序遍历 System . out . println ( "前序遍历" ) ; binaryTree . preOrder ( ) ; //中序遍历0 System . out . println ( "中序遍历" ) ; binaryTree . infixOrder ( ) ; /

数据结构二叉树基础以及四种遍历方式(递归和迭代)

做~自己de王妃 提交于 2020-03-02 07:27:18
数据结构二叉树基础 文章目录 数据结构二叉树基础 一、二叉树的基本概念 二、特殊的二叉树 三、二叉树的4种遍历方式 一、二叉树的基本概念 节点的度 :一个节点含有的子树的个数称为该节点的度; **树的度:**一棵树中,最大的节点的度称为树的度; 叶子节点或终端节点 :度为0的节点称为叶节点; 双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; **根结点:**一棵树中,没有双亲结点的结点; **树的高度或深度:**树中节点的最大层次 一棵二叉树 是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉 树组成。 二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于 2 的结点。 二叉树的子树有左右之分,其子树的次序不能颠倒 二、特殊的二叉树 1, 完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全 二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。 2, 满二叉树: 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果 一个二叉树的层数为K,且结点总数是(2^k)