中序遍历

二叉树(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(...)

【算法练习】树的遍历与合并排序数组

十年热恋 提交于 2020-03-03 16:01:57
目录 codewars 题目(难度:4K) 题目详解(中文) 个人思路 先序遍历 中序遍历 后序遍历 Leetcode 题目(难度:简单) 个人思路 运行效果 大神代码 codewars 题目(难度:4K) You are given a binary tree: class Node: def __init__(self, L, R, n): self.left = L self.right = R self.value = n Your task is to return the list with elements from tree sorted by levels, which means the root element goes first, then root children (from left to right) are second and third, and so on. Return empty list if root is None . Example 1 - following tree: 2 8 9 1 3 4 5 Should return following list: [2,8,9,1,3,4,5] Example 2 - following tree: 1 8 4 3 5 7 Should return following list:

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)

二叉树的遍历问题

非 Y 不嫁゛ 提交于 2020-03-02 01:02:36
二叉树的定义是用递归定义的,这样我们会发现在它在前中后遍历、甚至插入、建立程序中常常用到递归,实际上把握好了递归,也就把握好了二叉树的遍历问题。 下面是一些问题练习 1.从一个遍历(明确空树)中确定树 时间限制: 1 Sec 内存限制: 32 MB 提交: 312 解决: 186 [提交][状态][讨论版][命题人:外部导入] 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入 输入包括1行字符串,长度不超过100。 输出 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 样例输入 a#b#cdef##### a## 样例输出 a b f e d c a 分析: 这个问题其实简单,题目是给出了前序遍历的输入,如果我们也跟着前序遍历,过程中再建立树,题目就可解了,不过得注意边界条件发生了变化。 # include <iostream> # include <string> using namespace std ; string s ; int i , n ; //用来记录字符串位置和大小

二叉树遍历(已知前序,中序,求后序遍历)java

我与影子孤独终老i 提交于 2020-03-01 22:35:07
题目描述 二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。 输入 两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。 输出 输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。 样例输入 ABC CBA ABCDEFG DCBAEFG 样例输出 CBA DCBGFEA import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()) { String pre = in.next(); String mid = in.next(); String ans = postOrder(pre,mid); System.out.println(ans); } in

由二叉树先序遍历序列和后序遍历序列建二叉树

我怕爱的太早我们不能终老 提交于 2020-03-01 13:55:30
思路: 1.采用递归的思想建树 2.先序遍历序列的第一个元素始终是当前子树的根; 3.在中序遍历序列中以根节点为中心,前面的是左子树的先序遍历序列,后面的右子树的先序遍历序列; #include<iostream> #include<string> using namespace std; struct Node { char data; Node* lchild; Node* rchild; }; void PreOrder(Node* root) { if(root!=NULL) { cout<<root->data; PreOrder(root->lchild); PreOrder(root->rchild); } } void BuildTree(string sPre,string sMid,Node* &root) { if(sPre.length()==0||sMid.length()==0) return; root=new Node; root->data=sPre[0]; int index=sMid.find(sPre[0]); BuildTree(sPre.substr(1,index+1),sMid.substr(0,index),root->lchild); BuildTree(sPre.substr(index+1),sMid.substr(index