中序遍历

代码题(6)― 二叉树的遍历

匿名 (未验证) 提交于 2019-12-03 00:33:02
1、144. 二叉树的前序遍历 (1)递归 /* * * 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 > res; vector < int > preorderTraversal(TreeNode* root) { if (root == nullptr) return res; res.push_back(root -> val); preorderTraversal(root -> left); preorderTraversal(root -> right); return res; } }; (2)非递归 /* * * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right

C++ 二叉树的遍历

匿名 (未验证) 提交于 2019-12-03 00:32:02
#include <bits/stdc++.h> #define MaxSize 100 /* * Created by HarvestWu on 2018/06/19. */ using namespace std; typedef char ElemType; //定义二叉树结构 typedef struct BTNode { ElemType data; struct BTNode *lchild; struct BTNode *rchild; } BTNode; //定义存储结点指针及层号结构 typedef struct St { BTNode *p; int lno; } St; //由str串创建二树 void CreateBTNode (BTNode *&b,ElemType *str) { BTNode *St[MaxSize],*p= NULL; int top=-1, k = 0,j=0; ElemType ch; b= NULL; ch=str[j]; while (ch!='\0') { switch (ch) { case '(': top++; St[top]=p; k=1; break; case ')': top--; break; case ',': k=2; break; default: p=(BTNode *)malloc(sizeof

树相关算法(一)

匿名 (未验证) 提交于 2019-12-03 00:30:01
前言:算法竞赛中常见的树问题 (二叉)树的遍历 树的重心 树的直径 最近公共祖先(LCA) 哈夫曼树 树链剖分 一、(二叉)树的遍历 这种遍历顺序和DFS入栈的顺序很像,这种二叉树遍历方式称为先序遍历。除了先序遍历外,还有另外两种遍历,中序遍历和后序遍历。 先序遍历:访问根节点,遍历左子树,遍历右子树; 中序遍历:遍历左子树,访问根节点,遍历右子树; 后序遍历:遍历左子树,遍历右子树,访问根节点。 对于上面的那棵树,给出三种遍历方式是: 先序遍历: A->B->D->F ->G->H->I->E->C; 中序遍历:F->D->H->G->I->B->E->A->C; 后序遍历:F->H->I->G->D->E->B->C->A。 说了这么多,二叉树的遍历有什么用呢?答案是,没太大用。一般情况下是用来当做题目中的信息。对于OIer来说这些是常识,初赛会考的。 二、树的重心 树的重心,也叫树的质心。对于一棵树来说,删去该树的重心后,所有的子树的大小不会超过原树大小的二分之一。树的重心还有一个性质,是相对于树上的其他点而言的,就是删去重心后形成的所有子树中最大的一棵节点数最少。换句话说,就是删去重心后生成的多棵子树是最平衡的。一棵树的重心至多有两个。 #include<cstdio> #include<vector> #include<cstring> #include

数据结构之树篇1——二叉树

这一生的挚爱 提交于 2019-12-03 00:26:30
性质 基本性质: 二叉树_百度百科 关于二叉树的深度(高度)涉及到结点的层数,有的教材规定根结点在第 \(0\) 层,有的则规定根结点在第 \(1\) 层。 这里全部以 《数据结构-C语言版》(严蔚敏,吴伟民版) 为准: 高度和深度 为同一个概念, 根节点在第1层 ,树的高度是看一共有几层。 高度为 \(h\) 的完全二叉树,最多有 \(2^{n}-1\) 个节点,第 \(k\) 层最多有 \(2^{k-1}\) 个节点。 含有 \(n\) 个节点的完全二叉树,高度为 \(log(n)+ 1\) 下取整。 完全二叉树: 如果第一个元素下标为 \(1\) ,则第 \(k\) 个元素的左孩子为 \(2*k\) ,右孩子为 \(2*k+1\) ,父节点为 \(k / 2\) 下取整,最后一个父节点为 \(length / 2\) 下取整。 如果第一个元素下标为 \(0\) ,则第 \(k\) 个元素的左孩子为 \(2*k+1\) ,右孩子为 \(2*k+2\) ,父节点为 \((k - 1)/ 2\) 下取整,最后一个父节点为 \(length / 2\) 下取整后减一。 二叉树的前驱后继节点,表示中序遍历时,一个节点的前一个和后一个。 高度为 \(h\) 的完全二叉树, 最多有 \(2^{h}-1\) 个节点。 节点为 \(n\) 的完全二叉树, 高度为 \(log(n)\) 。

BST树的插入,删除,查找(递归和非递归),先序,中序,后序(递归和非递归)

匿名 (未验证) 提交于 2019-12-03 00:18:01
关于二叉查找树的操作还是挺重要的,所以在此实现了BST的相关操作。 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 首先实现BST的遍历操作吧,一般面试也喜欢问,比较重要的是各个遍历的非递归操作,在这里也就只实现非递归操作; 其中先序和中序遍历的非递归操作比较相似,主要思想就是将每个节点当做一个根节点进行操作。后序遍历稍微不同。下面进行代码的演示,以及相关解释: 首先针对先序遍历 Stack<TreeNode> snode = new Stack<>(); TreeNode p = root; while (!snode.isEmpty() || p != null) { if (p!=null) { System.out.print(p.value+" "); snode.push(p); p = p.left; }else{ TreeNode q = snode.pop(); p = q.right; } } 可以看到代码中利用了一个栈进行辅助,因为先序遍历的顺序是根-左-右,所以在向左节点进行遍历的时候,将节点输出,同时将节点放入栈中

根据先序遍历和中序遍历建立二叉树

匿名 (未验证) 提交于 2019-12-03 00:14:01
˼· 先序遍历服从规则 “根左右” ,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是 根节点 ; 中序遍历服从规则 ”左根右“ ,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的 左子树 ,而根节点右边的元素都属于根节点的 右子树 ; 所以,我们可以先通过先序遍历的第一个元素确定根节点,然后通过中序遍历结合根节点,获得当前根节点的左右子树,再将子树看成一棵独立的树,继续使用先序遍历判断根节点,中序遍历判断子树的方式,最终建立起整棵树; 假设有一棵二叉树,先序遍历为 {1,2,4,7,3,5,6,8} ,中序遍历为 {4,7,2,1,5,3,8,6} ,则建树过程如下: 首先,通过先序遍历可知树的根节点为 1 ,则在中序遍历中,1左边的元素 4,7,2 即为根的左子树的元素,而 1 右边的元素 5,3,8,6 即为根节点的右子树; 对于左子树 4,7,2 来说,在先序遍历中,这三个点的顺序为 2,4,7 ,则 2 为根节点,而在中序遍历中, 4,7 均在 2 的左边,则 4,7 均为以 2 为根树的左子树,且没有右子树; 对于 4,7 这两个节点来说,先序遍历中, 4 节点在7节点之前,所以 4 为根节点,而 7 作为子树,在中序遍历中, 7 在 4 之后,所以 7 为右子树; 对于根节点 1 的右子树 5,3,8,6 来说,在先序遍历中, 3

树-基本概念,遍历,表示法

匿名 (未验证) 提交于 2019-12-03 00:13:02
树的基本概念和常用术语 节点的度:一个结点的儿子结点个数称为该节点的度 树的度:一棵树的度是指该树中结点的最大度数。如上图的树的度是3 叶节点或终端节点:度为零的节点。如上图中E,I,J,C,G,H是叶节点 非终端节点或分支节点:度不为零的节点。除根节点外的分支节点都叫做内部节点。 路径:若存在树中的一个节点序列k1,k2,…,kj,使得结点ki是ki+1的父结点(1<=i<j),则称该结点序列是树中从结点k1到结点kj的一条路径。 路径长度:路径所经过的边的数目。 节点高度:从该结点到各叶结点的最长路径长度,例如上图中B,C,D的高度分别是2,0,1 树的高度: (这里规定单根的高度为0) 根结点的高度 结点的深度(或层数):从树根到任一结点n有唯一的路径,称该路径的长度为结点n的深度(或层数)。从根结点算起,根为第0层,它的孩子为第1层…… 森林:m(m>=0)棵互不相交的树的集合 树的遍历 前序遍历:先访问树根n,然后依次前序遍历T1,T2,…,Tk。 中序遍历:先中序遍历T1,然后访问树根n,接着依次对T2,T3,…,Tk 进行中序遍历。 后序遍历:先依次对T1,T2,…,Tk进行后序遍历,最后访问树根n。 树的表示方法 父节点数组表示法 (1)树中的结点数字化为它们的编号1,2,…,n。 (2)用一个一维数组存储每个结点的父结点。即:father[k

树的前中后序遍历和层次遍历

匿名 (未验证) 提交于 2019-12-03 00:11:01
#include <iostream> #include <stack> #include <queue> using namespace std; struct BitreeNode { int data; struct BitreeNode *lchild, *rchild; }; void InitTreeNode(BitreeNode &t, int data, BitreeNode *lchild, BitreeNode *rchild) { t.data = data; t.lchild = lchild; t.rchild = rchild; } //前序 void PreOrder(BitreeNode *t) { if (t != nullptr) { cout << t->data << " "; PreOrder(t->lchild); PreOrder(t->rchild); } } //中序 void Inorder(BitreeNode *t) { if (t != nullptr) { Inorder(t->lchild); cout << t->data << " "; Inorder(t->rchild); } } //后序 void PostOrder(BitreeNode *t) { if (t != nullptr) { PostOrder

二叉树

匿名 (未验证) 提交于 2019-12-03 00:06:01
  二叉树 是一种特殊的树,它具有以下 特点 : 左子树 与 右子树 ,次序不能颠倒。   满二叉树 作为一种特殊的二叉树,它是指:所有的分支节点都存在左子树与右子树,并且所有的叶子节点都在同一层上。其 特点 有: 2 h 1 h h 为树的深度。     h h ,除第 h h 层外,其它各层 ( 1 ~ h 1 ) h h 层所有的结点都连续集中在最左边,这就是 完全二叉树 。其具有以下 特点 :    二、二叉树的相关性质 i i 层上,至多有 2 i 1 ( i ≥ 1 ) (i≥1) 。 h h 的二叉树上最多有 2 h 1 ( k ≥ 1 ) (k≥1) 。 n 0 n0 ,度数为 2 2 的节点个数为 n 2 n2 ,则有: n 0 = n 2 + 1 n0=n2+1 。 n n 个的结点的完全二叉树的深度为 log 2 n + 1 n n 个节点的完全二叉树的节点按层次序编号,对任一层的节点 i , ( 1 ≥ i ≥ n ) i,(1≥i≥n) 有: i = 1 i=1 ,则节点是二叉树的根,无双亲,如果 i > 1 i>1 ,则其双亲节点为 i / 2 2 i > n 2i>n 那么节点i没有左孩子,否则其左孩子为 2 i 2i 。 2 i + 1 > n 2i+1>n 那么节点没有右孩子,否则右孩子为 2 i + 1 2i+1 。 三、二叉树的数据结构

树、图、排序查找重要算法(960算法)

匿名 (未验证) 提交于 2019-12-03 00:06:01
设计求T的WPL的算法:   (1) .给出二叉树结点的数据类型定义;   (2) .给出C语言描述算法; 1 typedef struct node { int weight; struct node *left,*right; //指向结点左右子女的指针 }BiNode,*BiTree; 2 int WPL=0; void inorder(BiTree bt,level lv) //bt是二叉树,lv是结点的层次,初值为1 { if(bt) {inorder (bt->left,lv+1); //中序遍历左子树 if(bt->left==null &&bt->right==null) //判断该结点是否为叶子 WPL+=(lv-1)*bt->weight; //累加结点带权路径长度 inorder(bt->right,lv+1); } } NLR void PreOrder(BiTree T){ if(T!=NULL){ visit(T); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 preOrder(T->rchild); } } LNR void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } } LRN void