中序遍历

LeetCode 94.二叉树的中序遍历

社会主义新天地 提交于 2020-02-02 05:18:30
题目链接: https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 题目描述:给定一个二叉树,返回它的 中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路:简单的中序遍历~ 代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> v; void inorder(TreeNode* root){ if(root == NULL) return; inorder(root -> left); v.push_back(root -> val); inorder(root -> right); } vector<int> inorderTraversal(TreeNode* root) { inorder(root); return v; } }; 来源: CSDN 作者: Xinstein666 链接

树(一)树的遍历

大兔子大兔子 提交于 2020-01-31 17:45:35
树的遍历 近期参加复旦互联网协会的刷题营,所以我勉勉强强又开始做题啦。现在变得更务实啦,要想提升能力,超过别人就是要依靠一项项的指标的胜利,这样的评价是更加客观的。想要提升能力,一方面要靠平时的积累,另外一方面也要依靠瓶颈期的奋力一搏。当然,我的意思是更加侧重前者的。话不多说啦,开始今天的话题——树的遍历。如果用递归的方法是非常简单,也是非常推荐的。但是,用迭代的方法也不难!!!所以我决定在这里探讨一下。 LeetCode题目 中序遍历 , 前序遍历 和 后序遍历 。当然,我知道有的朋友,就是喜欢野蛮自己的体魄,那你可以试一试, 从中序与后序遍历序列构造二叉树 , 从前序与中序遍历序列构造二叉树 以及 根据前序和后序遍历构造二叉树 。 保证你可以受到全身心的虐待。 各种遍历——递归实现 首先是TreeNode结构。 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 三种遍历的区别在于,什么时候访问root的值。下面是中序遍历,返回按序排序的值。 class Solution { List<Integer> list = new LinkedList<>(); public List<Integer> inorderTraversal

数据结构 递归遍历二叉树 C/C++

断了今生、忘了曾经 提交于 2020-01-31 06:38:47
#include<stdio.h> #include<stdlib.h> typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } void Preorder(bitree bt) //前序遍历 { if(bt==NULL) return; printf("%c ",bt->data); Preorder(bt->lchild); Preorder(bt->rchild); } void Inorder(bitree bt) //中序遍历 { if(bt==NULL) return; Preorder(bt->lchild); printf("%c ",bt->data); Preorder(bt->rchild); } void

数据结构 非递归遍历二叉树

一世执手 提交于 2020-01-31 04:59:35
#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct { bitree ptr; int flag; }stacknode; typedef struct { stacknode elm[MAX]; int top; }sqstack; typedef struct btnode { char data; struct btnode *lchild,*rchild; }btnode,*bitree; bitree Creatbintree() //前序遍历创建二叉树 { char ch; bitree bt; scanf("%c",&ch); if(ch=='#') bt=NULL; else { bt=(btnode*)malloc(sizeof(btnode)); bt->data=ch; bt->lchild=Creatbintree(); bt->rchild=Creatbintree(); } return bt; } typedef struct { bitree data[MAX]; int top; }seqstack; seqstack *Init_seqstack() { seqstack *s; s=malloc(sizeof(seqstack)); if(s) s->top=

树与二叉树

戏子无情 提交于 2020-01-30 11:11:20
树 有许多逻辑关系并不是简单的线性关系,在实际场景中,常常存在着一对多,甚至是多对多的情况。其中树和图就是典型的非线性数据结构,我们首先讲一讲树的知识。 什么是树呢?在现实生活中有很多体现树的逻辑的例子。例如你家的“家谱”,就是一个“树”。再如企业里的职级关系,也是一个“树”。 除人与人之间的关系之外,许多抽象的东西也可以成为一个“树”,如一本书的目录。 以上这些例子有什么共同点呢?为什么可以称它们为“树”呢?因为它们都像自然界中的树一样,从同一个“根”衍生出许多“枝干”,再从每一个“枝干”衍生出许多更小的“枝干”,最后衍生出更多的“叶子”。 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 下面这张图,就是一个标准的树结构。 在上图中,节点1是根节点(root);节点5、6、7、8是树的末端,没有“孩子”,被称为叶子节点(leaf)。图中的虚线部分,是根节点1的其中一个子树。 同时,树的结构从根节点到叶子节点

二叉树的创建与递归和非递归遍历

瘦欲@ 提交于 2020-01-29 23:53:28
二叉树的常规操作就是遍历,这也是二叉树的基本功之一 class TreeNode(): def __init__(self, x): self.val = x self.left = None self.right = None class BinaryTree(object): def __init__(self, pre, tin): self.pre = pre self.tin = tin self.levelTrave = [] # 层次遍历结果 self.preTraveRecur = [] # 前序递归遍历结果 self.preTraveNoRecur = [] # 前序非递归遍历结果 self.inTraveRecur = [] # 中序递归遍历结果 self.inTraveNoRecur = [] # 中序非递归遍历结果 self.postTraveRecur = [] # 后序递归遍历结果 self.postTraveNoRecur = [] # 后序非递归遍历结果 # 利用前序遍历和中序遍历结果重建二叉树 def reConstructBinaryTree(self, pre, tin): # pre为前序遍历结果,tin为中序遍历结果 if len(pre) == 0: return None if len(pre) == 1: return

二叉树的遍历

醉酒当歌 提交于 2020-01-29 20:47:50
1、二叉树的广度遍历 2、二叉树的深度遍历 二叉树的深度遍历,包括了前序遍历、中序遍历、后续遍历。其命名方式是根节点的遍历顺序, 即:先序遍历:先遍历根节点(根节点->左子树->右子树),即先访问根节点再递归的访问左子树,然后递归的访问右子树。 中序遍历:访问的中间位置为根位置,其主要顺序为(左子树->根节点->右子树),即我们先递归的使用中序遍历访问左子树,让后根节点,然后递归的使用中序遍历访问右子树。 后序遍历:最后访问根节点(左子树->右子树->根节点),即我们先递归的使用后续遍历访问左子树,然后递归的使用后续遍历右子树,最后访问根节点 来源: CSDN 作者: lianchaozhao 链接: https://blog.csdn.net/weixin_40809627/article/details/104105319

二叉树的遍历.队列与栈实现

天大地大妈咪最大 提交于 2020-01-29 20:45:32
树的遍历方法有广度优先(层序遍历),以及深度优先两种方法,分成先序遍历,中序遍历,后序遍历三种。 一.深度优先: 1.递归实现: 先序遍历 输出顺序:根节点,左子树,右子树。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { //如果树非空 printf ( "%d" , BT - > Data ) ; //输出根节点 PreOrderTraversal ( BT - > Left ) ; //继续递归执行其左子树 PreOrderTraversal ( BT - > Right ) ; //继续递归其右子树 } } 中序输出:左子树,根节点,右子树。 只需要将输出语句放到两个递归语句之间即可。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ; printf ( "%d" , BT - > Data ) ; PreOrderTraversal ( BT - > Right ) ; } } 后序输出:左子树,右子树,根节点。 void PreOrderTraversal ( BinTree BT ) { if ( BT ) { PreOrderTraversal ( BT - > Left ) ;

二叉树的非递归遍历

牧云@^-^@ 提交于 2020-01-29 04:41:47
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1.递归实现 void preOrder1(BinTree *root) //递归前序遍历 { if(root!=NULL) { cout<<root->data<<" "; preOrder1(root->lchild); preOrder1(root->rchild); }} 2.非递归实现 根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树。因此其处理过程如下: 对于任一结点P: 1)访问结点P,并将结点P入栈; 2)判断结点P的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P,循环至1);若不为空,则将P的左孩子置为当前的结点P; 3

C/C++树遍历的应用-树的重建

断了今生、忘了曾经 提交于 2020-01-29 01:35:58
输入: 第1行输入二叉树的结点数 第2行输入前序遍历的结点编号序列,相邻编号用空格分开 第3行输入中序遍历的结点编号序列,相邻编号用空格分开 输出: 在1行中输出后序遍历的结点编号序列,用空格分开 代码 # include <iostream> # include <string> # include <algorithm> # include <vector> using namespace std ; int n , pos ; vector < int > pre , in , post ; void rec ( int l , int r ) { if ( l >= r ) return ; int root = pre [ pos ++ ] ; int m = distance ( in . begin ( ) , find ( in . begin ( ) , in . end ( ) , root ) ) ; rec ( l , m ) ; rec ( m + 1 , r ) ; post . push_back ( root ) ; } void solve ( ) { pos = 0 ; rec ( 0 , pre . size ( ) ) ; for ( int i = 0 ; i < n ; i ++ ) { if ( i ) cout << " " ;