二叉树遍历

二叉树遍历

天大地大妈咪最大 提交于 2020-01-21 07:54:32
二叉树遍历最简单的就是递归了。因为递归实质上是栈存了一些中间值,所以我们可以使用stack实现迭代版的遍历。 中序遍历 步骤: 首先将root节点作为当前节点。 1.如果当前节点不为空,压入当前节点。将左节点作为当前节点。 2.否则弹出栈顶节点作为当前节点,输出当前节点。 3.如果右节点不为空,右节点作为当前节点。 4.否则将当前节点置为空。 重复1、2、3、4直到栈为空。 void InorderTraversal(TreeNode *root){ if(!root)return; TreeNode *node=root; stack<TreeNode*> mystk; while(node||mystk.size()){ while(node){ mystk.push(node); node=node->left; } node=mystk.top(); mystk.pop(); cout<<node->val<<'\t'; if(node->right){ node=node->right; }else{ node=NULL; } } } 前序遍历 前序遍历和中序遍历差不多,只是输出节点值的时机不同。 步骤: 以root节点作为当前节点 1.如果当前节点不为空,将当前节点压入栈,同时输出当前节点。并将左节点作为当前节点。 2.否则弹出栈顶作为当前节点。 3.如果右节点不为空

二叉树非递归遍历的实现

◇◆丶佛笑我妖孽 提交于 2020-01-21 07:30:58
/*二叉树的遍历之非递归实现*/ /*非递归实现采用栈去模拟实现*/ //参考代码http://blog.csdn.net/ns_code/article/details/12977901 节点访问 1 void visit(BTNode*b) 2 { 3 //输出格式依赖于elementType 4 printf("%c",b->data); 5 } 先序遍历 根据先序遍历的顺序,先访问根节点,再访问左子树,后访问右子树,而对于每个子树来说, 又按照同样的访问顺序进行遍历。非递归的实现思路如下: 对于任一节点P, 1)输出节点P,然后将其入栈,再看P的左孩子是否为空; 2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作; 3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点, 看其是否为空; 4)若不为空,则循环至1)操作; 5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否 为空,重复4)和5)操作; 6)直到当前节点P为NULL并且栈空,遍历结束。 void PreOrder(BTree bt) { PSTACK stack=NULL; stack=CreateStack(); //创建一个空栈 elementType node_pop; //用来保存出栈节点 elementType pCur=bt;

浅谈数据结构-二叉树

浪子不回头ぞ 提交于 2020-01-20 17:35:34
二叉树是树的特殊一种,具有如下特点:1、每个结点最多有两颗子树,结点的度最大为2。2、左子树和右子树是有顺序的,次序不能颠倒。3、即使某结点只有一个子树,也要区分左右子树。 一、特殊的二叉树及特点 1、斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树)。这就是斜树,应用较少 2、满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树。就是完美圆满的意思,关键在于树的平衡。 根据满二叉树的定义,得到其特点为: 叶子只能出现在最下一层。 非叶子结点度一定是2. 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。 3、完全二叉树 对一棵具有n个结点的二叉树按层序排号,如果编号为i的结点与同样深度的满二叉树编号为i结点在二叉树中位置完全相同,就是完全二叉树。满二叉树必须是完全二叉树,反过来不一定成立。 其中关键点是按层序编号,然后对应查找。 在上图中,树1,按层次编号5结点没有左子树,有右子树,10结点缺失。树2由于3结点没有字数,是的6,7位置空挡了。树3中结点5没有子树。 上图就是一个完全二叉树。 结合完全二叉树定义得到其特点: 叶子结点只能出现在最下一层(满二叉树继承而来) 最下层叶子结点一定集中在左 部连续位置。 倒数第二层,如有叶子节点,一定出现在右部连续位置。 同样结点树的二叉树,完全二叉树的深度最小

二叉树的遍历与建立

主宰稳场 提交于 2020-01-20 07:00:03
内容简介 本次作业在二叉树的建立方面,我使用了先序输入的方法来建立,即使用递归来实现。在遍历输出方面,有先序、中序、和后序三种。 其中,本次建立二叉树时,输入结束的条件为输入数据为0。 本程序创建的二叉树如下: 相关代码: include using namespace std; typedef struct node//创建节点结构 { char data;//数据元素 struct node Lchild;//指向左孩子结点 struct node Rchild;//指向右孩子结点 }BinNode,*BinTree; void CreateTree(BinTree &T);//递归法建立二叉树 void PreOrder(BinTree &T);//先序遍历 void InOrder(BinTree &T);//中序遍历 void PostOrder(BinTree &T);//后序遍历 int main() { BinTree T; cout<<"请输入二叉树节点:"; CreateTree(T); cout<<"先序遍历:"; PreOrder(T); cout<<endl; cout<<"中序遍历:"; InOrder(T); cout<<endl; cout<<"后序遍历:"; PostOrder(T); cout<<endl; return 0; } void

树的建立及遍历

天涯浪子 提交于 2020-01-20 05:39:08
内容简介 本次作业在建立二叉树方面,使用了先序输入建立的方法(递归实现)。在遍历输出方面,有先序/中序/后序遍历三种。 其中,本次建立二叉树时,输入结束的条件为输入数据为'.'。 用链式结构存储,生成的树大体如上图 二叉树的建立 树的结构体 typedef struct dfs *tree; struct dfs { tree lchild ,rchild; char data; }; 按先序输入建立二叉树 tree DFS() { char m; cin>>m; tree father; father=new struct dfs; if(m=='.') father = NULL; else { father->data=m; father->lchild=DFS(); father->rchild=DFS(); } return father; } 这里用递归法创建树,每次递归返回父节点指针,当碰到表示为空的'.'时,使父节点为空。先序输入建立二叉树是从根节点出发, 先建立每个父节点的左孩子,当没有左孩子时依次返回建立每个父节点右孩子,直至最后一个右孩子被创建,返回所有父节点, 生成一棵二叉树。 二叉树的遍历 1.先序遍历 思路:先访问根结点 -> 遍历左子树 -> 遍历右子树;先访问根结点 void frontorder(tree root) { if(root) {

数据结构:线索二叉树的遍历

这一生的挚爱 提交于 2020-01-19 07:03:12
题目: 中序线索化上述二叉树并找出根结点的前驱和后继。 思路: (1)利用递归函数创建一颗普通的二叉树 (2)1.左子树线索化(返回修改后的pre); 2.当前结点p线索化 建前驱线索(当前结点左空,指向pre); 建后继线索(pre右空,pre指向当前结点); 重新修改前驱结点p指针为 pre; 3.右子树线索化(将新的pre输入) (4)将pre的右标志数置1,右子树置NULL。 (5)将该线索树进行中序遍历,并将结果依次放入vector中 (6)在vector中查找相对应的结点值,前后值则分别为前驱和后置,同时对可能的错误和特殊情况进行处理。 代码块: # include "pch.h" # include <iostream> # include <vector> using namespace std ; vector < char > tmp ; struct Btree { //二叉树结构 char data ; Btree * lchild ; Btree * rchild ; int ltag ; int rtag ; } ; void create ( Btree * & t ) //创建二叉树 { char data ; cin >> data ; t = new Btree ; if ( data == '#' ) t = NULL ; //以#为终止符号

二叉树

牧云@^-^@ 提交于 2020-01-18 23:36:19
二叉树 二叉树的概念 定义:每个节点最多只能有两个子节点的一种形式称之为二叉树 二叉树的节点分为左节点和右节点 图示: 满二叉树:二叉树的所有叶子节点(无分叉的节点)都在最后一层,并且总结点数为2 n - 1,n为层数 图示: 完全二叉树:所有的叶子节点都在最后一层或者是倒数第二层,并且最后一层左边连续,倒数第二层右边连续。连续就是都是这一层的。 图示: 二叉树的遍历方式 基本概念 前序遍历:先输出父节点,在遍历左子树和右子树 中序遍历:先遍历左子树,在输出父节点,在遍历右子树 后序遍历:先遍历左子树,再遍历右子树,最后输出父节点 ** 父节点的输出先后决定其实遍历的顺序** 思路分析 创建一个二叉树 遍历: 前序遍历: 输出当前节点 判断:如果左子节点不为空,那就继续前序遍历 判断:如果右子节点不为空,那就继续前序遍历 中序遍历: 如果当前节点的左子节点不为空,则递归中序遍历 输出当前节点 如果当前节点右子节点不为空,那就递归中序遍历 后序遍历: 如果当前节点的左子节点不为空,那就递归左子节点 如果当前节点的右子节点不为空,那就递归右子节点 输出当前节点 代码实现: class BinaryTree { //二叉树有必须有根节点 private HeroNode root ; public BinaryTree ( HeroNode root ) { this . root =

23-二叉搜索树的后序遍历序列

谁说我不能喝 提交于 2020-01-18 22:44:29
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 1.后续遍历我们可以知道,最右边的是根节点r。 2.通过根节点r我们可以判断左子树和右子树。 3.判断左子树中的每个值是否小于r,右子树的每个值是否大于r. 4.对左、右子树递归判断。 // 递归版 function VerifySquenceOfBST ( sequence ) { // write code here if ( sequence . length == 0 ) return false ; return isSquence ( sequence , 0 , sequence . length - 1 ) } function isSquence ( squence , start , end ) { if ( start >= end ) return true ; var i = start ; while ( i < end && squence [ i ] < squence [ end ] ) { i ++ ; } for ( var j = i ; j < end ; j ++

《LeetCode笔记8》:二叉树的中序遍历

老子叫甜甜 提交于 2020-01-17 23:11:47
题目: 给定一个二叉树,返回它的 中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一: 利用 栈+迭代 进行 中序遍历 ,主要分为以下几种情况: (设立一个标志T,T=0时,当前节点的左子树未遍历,T=1时,左子树遍历) 1.当前节点有左子树且未遍历->节点暂存于栈,遍历左子树; 2.当前节点无左子树或左子树已遍历:->输出当前节点,并判断是否有右子树: 1)无右子树,返回上一节点,T=1; 2)有右子树,遍历右子树,T=0; # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: stack = ['0'] T = 0 L = [] x = root if(x == None): return L while(stack): # print(stack) if(x.left!=None and T==0): stack

二叉树---中续遍历(递归)

蓝咒 提交于 2020-01-17 23:04:25
@Adrian 二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点 2 的左子树遍历完成,访问节点 2; 遍历节点 2 的右子树,找到节点 5; 由于节点 5 无左子树,因此访问节点 5 ,又因为节点 5 没有右子树,因此节点 1 的左子树遍历完成,访问节点 1 ,并遍历节点 1 的右子树,找到节点 3; 遍历节点 3 的左子树,找到节点 6; 由于节点 6 无左子树,因此访问节点 6,又因为该节点无右子树,因此节点 3 的左子树遍历完成,开始访问节点 3 ,并遍历节点 3 的右子树,找到节点 7; 由于节点 7 无左子树,因此访问节点 7,又因为该节点无右子树,因此节点 1 的右子树遍历完成,即整棵树遍历完成; 二叉树采用中序遍历得到的序列为: 4 2 5 1 6 3 7 递归中序遍历: # include <stdio.h> # include <string.h> # define TElemType int //构造结点的结构体 typedef struct