先序遍历

树的总结(遍历,BST,AVL原型,练习题)

天涯浪子 提交于 2019-12-01 09:00:53
目录 树 一.抽象数据类型 二、二叉树的性质 三、活用树的遍历 四、BST树 五、AVL树 六、BST树和AVL树练习 树 一.抽象数据类型 1.顺序存储 使用数组存储 父亲索引为 n 左孩子 2*n 右孩子 2*n+1 2.链式存储 typedef struct TNode *Position; typedef Position BinTree; /* 二叉树类型 */ struct TNode{ /* 树结点定义 */ ElementType Data; /* 结点数据 */ BinTree Left; /* 指向左子树 */ BinTree Right; /* 指向右子树 */ }; 二、二叉树的性质 1.二叉树第i层最大结点数为:2^(i-1),i>=1 2.深度为k的二叉树最大结点总数为:2^k-1,k>=1 3.对任何非空二叉树T,若n0表示叶子结点个数、n2是度为2的非叶子结点个数,那么二者满足关系n0=n2+1 void PreOrderTraversal(BinTree BT){ if(BT){ printf("%d",BT->Data); PreOrderTraversal(BT->Left); PreOrderTraversal(BT->Right); } } 中序后序同理,把打印放在中间和后面,这里不加以赘述。 3.2.非递归 以链式中序为例 void

根据后序和中序遍历输出先序遍历

℡╲_俬逩灬. 提交于 2019-12-01 06:08:47
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。 输入格式: 第一行给出正整数 N( ≤ 3 0),是树中结点的个数。随后两行,每行给出 N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。 输出格式: 在一行中输出 Preorder: 以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: Preorder: 4 1 3 2 6 5 7之前学递归,全排列、整数分解什么的都做不出来,也不想想,弄的自己原地停了一个星期。。。。现在想想,还是自己太着急。这个题用递归实现的,知道中序遍历和后序遍历,建树,然后输出先序遍历。递归思路和创建树一样,就是创建根节点,创建它的左孩子右孩子,多了参数限制 #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; typedef int TElemType; typedef int Status; #define OK 1 #define ERROR 0 typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild;

二叉树遍历

心已入冬 提交于 2019-12-01 02:39:53
public class BinaryTree { public static void main(String[] args) { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); print(root); } /** * 先序遍历:访问根结点的操作发生在遍历其左右子树之前。 根节点 -> 左子树 -> 右子树 1 2 4 5 3 6 7 * 中序遍历:访问根结点的操作发生在遍历其左右子树中间。 左子树 -> 根节点 -> 右子树 4 2 5 1 6 3 7 * 后序遍历:访问根结点的操作发生在遍历其左右子树之后。 左子树 -> 右子树 -> 根节点 4 5 2 6 7 3 1 * */ public static void print(Node root) { if (root == null) { return; } // 先序遍历,这行是第一次来到该节点 // System.out.print(root.value + " ");

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

感情迁移 提交于 2019-12-01 02:13:05
问题 ​ 已知一棵二叉树的先序遍历以及中序遍历,重建二叉树。二叉树的每一个节点有三个属性,左子节点,右子节点,以及节点值。 思路 先序遍历服从规则 “根左右” ,所以由此可知,对于一个先序遍历得到的数组,第一个元素一定是 根节点 ; 中序遍历服从规则 ”左根右“ ,所以由此可知,对于一个中序遍历得到的数组,根节点左边的元素都属于根节点的 左子树 ,而根节点右边的元素都属于根节点的 右子树 ; 所以,我们可以先通过先序遍历的第一个元素确定根节点,然后通过中序遍历结合根节点,获得当前根节点的左右子树,再将子树看成一棵独立的树,继续使用先序遍历判断根节点,中序遍历判断子树的方式,最终建立起整棵树; 例子 假设有一棵二叉树,先序遍历为 {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

NOIp初赛题目整理

寵の児 提交于 2019-12-01 00:21:50
NOIp初赛题目整理 这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期更新。 1、(07senior,5) 在C 语言中,表达式 \(23~\mid~2~\land^~5\) 的值是( ) ​ A. \(23\) B. \(1\) C. \(18\) D. \(32\) E. \(24\) Answer:A Solution:这题一看就是要考运算符优先级来着。在 \(C\) 语言中, 按位与大于按位异或大于按位或 ,这里的大于指优先级大于,优先级越大越优先计算,因此计算过程为 \(2~\land~5~=~7\) 。然后计算 \(23~\mid~7 = 23\) 。 需要指出的是,左右移的优先级大于上述三个运算,因此 \(C\) 语言表达式 1 | p << 1 是先算 p << 1 ,再对 \(1\) 取或,例如 \(1~\mid~3~<<~1\) 的答案是 \(9\) 。 2、(07senior,12) 与十进制数 \(17.5625\) 对应的 \(8\) 进制数是( )。 ​ A. \(21.5625\) B. \(21.44\) C. \(21.73\) \(D.21.731\) Answer:B Solution:这里介绍一下分数的进制转换

二叉树的遍历

若如初见. 提交于 2019-11-30 13:42:57
·1.Binary Tree Preorder Traversal 使用栈,时间复杂度O(n),空间复杂度O(n) public static void preOrderRec(Node root){ if (root != null) s.push(root); while (!s.isEmpty()) { final TreeNode p = s.pop(); result.add(p.val); if (p.right != null) s.push(p.right); if (p.left != null) s.push(p.left); } 递归先序遍历,时间复杂度O(n),空间复杂度O(n) public static void preOrderRec(Node root){   if(root!=null){   System.out.println(root.value);   preOrderRec(root.left);   preOrderRec(root.right); } } Morris先序遍历,时间复杂度O(n),空间复杂度O(1) 步骤: 1.如果当前节点的左孩子为空,则输出当前节点并将其右孩子作为当前节点。 2.如果当前节点的左孩子不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点。 a) 如果前驱节点的右孩子为空

二叉树先序、中序、后续遍历非递归

心不动则不痛 提交于 2019-11-30 13:20:01
1 ** 2 * 二叉树先序遍历非递归 3 * @param root 4 */ 5 public void preOrder_no_recursive(TreeNode root){ 6 if(root == null) return; 7 8 Stack<TreeNode> stack = new Stack<>(); 9 stack.add(root); 10 while(!stack.isEmpty()){ 11 TreeNode tn = stack.pop(); 12 System.out.println(tn.val); // 输出 13 if(tn.right != null) stack.add(tn.right); 14 if(tn.left != null)stack.add(tn.left); 15 } 16 } 17 18 /** 19 * 二叉树中序遍历非递归 20 * @param root 21 */ 22 public void inOrder_no_recursive(TreeNode root){ 23 if(root==null)return; 24 Stack<TreeNode> stk = new Stack<TreeNode>(); 25 TreeNode p = root;//辅助节点 26 stk.add(p); 27 while

二叉树的遍历算法

大城市里の小女人 提交于 2019-11-30 12:05:43
遍历(Traverse) 就是按照某种次序访问树中的所有结点,且每个结点恰好访问一次 也就是说,按照被访问的次序,可以得到由树中所有结点排成的一个序列 树的遍历也可以看成是人为的将非线性结构线性化 这里的“访问”是广义的,可以是对结点作各种处理,例如输出结点信息、更新结点信息等 在我们的现实中,并不真正的“访问”这些结点,而是得到一个结点的线性序列,以线性表的形式输出 将整个二叉树看做三部分:根、左子树、右子树。如果规定先遍历左子树、在遍历右子树,那么根据根的遍历顺序就有三种遍历方式: 左子树 右子树 根 先序/根遍历DLR:根 左子树 右子树 中序/根遍历LDR:左子树 根 右子树 后序/根遍历LRD:左子树 右子树 根 注意:由于树的递归定义,其实对三种遍历的概念其实也是一个递归的描述过程 先序/根遍历DLR:1 4 5 2 3 6 7 中序/根遍历LDR:4 5 1 3 2 6 7 后序/根遍历LRD:5 4 3 7 6 2 1 如果按层次遍历,没有递归 面试题:已知一棵二叉树的后序遍历的序列为5 4 3 7 6 2 1,中序遍历的序列为4 5 1 3 2 6 7,则其先序遍历的序列是什么? 只要给定中序遍历,先序遍历或者后序遍历再给一个,就可以求出另一个 后序遍历最后肯定是根,所以确定1是根 所以4 5是左子树,3 2 6 7是右子树 依此类推 /** *二叉链表的结点 *

C语言实现二叉树的基本功能

两盒软妹~` 提交于 2019-11-30 09:13:00
本程序实现二叉树的如下功能 1、以先序序列和中序序列构造二叉树 2、以层序序列和中序序列构造二叉树 3、先序遍历、中序遍历、后序遍历、层序遍历 4、求二叉树高度 5、验证这个二叉树是否具备这样的性质:任何一个子树中的结点集合,树根结点的值总是最小。(按字母序) 6、拷贝二叉树 7、将二叉树左右子树交换 8、销毁二叉树 9、删除值为x的节点及其全部子孙 binary_tree.h文件 注:queue.h文件在 这里 # ifndef __BINARY_TREE_H__ # define __BINARY_TREE_H__ # include <stdio.h> # include <stdlib.h> # include <string.h> # include <stdbool.h> # include "queue.h" # define SIZE_bt 1024 struct bt { char data ; struct bt * lchild , * rchild ; } ; struct bt * PreInBuild ( char * pre , char * in ) ; //以先序序列和中序序列构造二叉树 struct bt * LevelInBuild ( char * level , char * in ) ; //以层序序列和中序序列构造二叉树 void

数据结构及算法基础学习笔记

风格不统一 提交于 2019-11-30 06:01:56
1.python数据结构及算法基础学习笔记思维导图 2.程序代码演示 1.链表模型:linklist.py 1 """ 2 功能: 实现单链表的构建和操作 3 4 """ 5 6 # 创建节点类 7 class Node: 8 """ 9 思路 : *自定义类视为节点类,类中的属性为数据内容 10 *写一个next属性,用来和下一个 节点建立关系 11 """ 12 def __init__(self,val,next = None): 13 """ 14 val: 有用数据 15 next: 下一个节点引用 16 """ 17 self.val = val 18 self.next = next 19 20 21 # 链式线性表操作类 22 class LinkList: 23 """ 24 思路 : 生成单链表,通过实例化的对象就代表一个链表 25 可以调用具体的操作方法完成各种功能 26 """ 27 def __init__(self): 28 # 链表的初始化节点,没有有用数据,但是便于标记链表的开端 29 self.head = Node(None) 30 31 # 初始化链表,添加一组节点 32 def init_list(self,list_): 33 p = self.head # p 作为移动变量 34 for i in list_: 35 #