先序遍历

已知先序遍历求叶子数

。_饼干妹妹 提交于 2020-03-07 07:00:15
#include #include <bits/stdc++.h> using namespace std; char a[55]; int s=0; int sum; struct node { char data; struct node *l,*r; }; struct node *creat() { struct node root; char c; c=a[s++]; if(c==’,’) root=NULL; else { root=(struct node )malloc(sizeof(struct node)); root->data=c; if(root) { root->l=creat(); root->r=creat(); } } return root; }; int yezi(struct node *root) { if(root NULL) return 0; if(root->l NULL&&root->r==NULL) return 1; else return yezi(root->l)+yezi(root->r); } int main() { struct node *root; while(~scanf("%s",a)) { s=0; root=creat(); sum=yezi(root); printf("%d\n",sum); }

原生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回调函数里。

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

帅比萌擦擦* 提交于 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 ) ; } } }

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

做~自己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 ; //用来记录字符串位置和大小

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

我怕爱的太早我们不能终老 提交于 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

先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

假装没事ソ 提交于 2020-03-01 13:54:02
题目: http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1291 以前的一个题,贴下代码; 1 #include<stdio.h> 2 #include<string.h> 3 char ans[100]; 4 5 void build(int n, char *s1, char *s2, char *s) 6 { 7 if(n <= 0) return; 8 int p = strchr(s2, s1[0])-s2; 9 build(p, s1+1, s2, s); 10 build(n-p-1, s1+p+1, s2+p+1, s+p); 11 s[n-1]=s1[0];//将根节点添加到最后 12 }; 13 14 int main() 15 { 16 int k,t; 17 char s1[100], s2[100]; 18 gets(s1); 19 gets(s2); 20 k=strlen(s1); 21 build(k, s1, s2,ans); 22 printf("%s\n",ans); 23 return 0; 24 } 来源: https://www.cnblogs.com/bfshm/p/3166010.html