leetcode144-先序遍历非递归实现】的更多相关文章

二叉树先序,中序,后序遍历非递归实现 分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报 structc 利用栈实现二叉树的先序,中序,后序遍历的非递归操作 [cpp] view plaincopy #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <queue> #include <stack> #include &…
二叉树的先序/中序/后序遍历递归/非递归实现,讲的很清楚,其中后序遍历和先序中序的处理有些不一样: https://blog.yangx.site/2016/07/22/Python-binary-tree-traverse/…
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二叉树: //递归建立二叉树 public static void BuildTree(TreeNode node, int data){ if(node == null){ node = new TreeNode(data); } if(data <= node.val){ if(node.left…
统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&path) { if (root) { path.emplace_back(root->val); PreOrder(root->left, path); PreOrder(root->right, path); } } 中序遍历: void InOrder(TreeNode* root, ve…
例题 中序遍历94. Binary Tree Inorder Traversal 先序遍历144. Binary Tree Preorder Traversal 后序遍历145. Binary Tree Postorder Traversal 递归栈 递归函数栈的方法很基础,写法也很简单,三种遍历方式之间只需要改变一行代码的位置即可 中序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre…
前面已经说了图的深度优先遍历算法,是用递归实现的,而在这里就讲一下用非递归实现,需要借助栈: 算法思想:        1. 栈初始化        2. 输出起始顶点,起始顶点改为“已访问”标志,将起始顶点进栈        3. 重复下列操作直到栈为空:                  3.1 取栈顶元素顶点                  3.2 栈顶元素顶点存在未被访问过的邻接点w,则:                                 3.2.1  输出顶点w    …
本文用递归算法实现二叉树的前序.中序和后序遍历,提供Java版的基本模板,在模板上稍作修改,即可解决LeetCode144. Binary Tree Preorder Traversal(二叉树前序遍历),94. Binary Tree Inorder Traversal(二叉树中序遍历),145. Binary Tree Postorder Traversal(二叉树后序遍历). 基本概念 二叉树的遍历是根据访问结点操作发生位置命名: 前序:访问根结点的操作发生在遍历其左右子树之前. 中序:访…
对A1135这题有心里阴影了,今天终于拿下AC.学习自柳神博客:https://www.liuchuo.net/archives/4099 首先读题很关键: There is a kind of balanced binary search tree named red-black tree in the data structure……………… 红黑树首先应该是一棵BST树,不然从何谈起维护二分查找结构? 所以第一步就应该根据先序遍历以及BST树的特性来判断是否是一棵BST树,然后根据这两个条…
#include <iostream> #include <cstdio> #include <vector> #include <stack> #define ls(x) (((x + 1)<<1) - 1) #define rs(x) ((x + 1)<<1) using namespace std; ; typedef struct Node{ struct Node *left; struct Node *right; int…
import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; //structure of binary tree class BiTree { BiTree lchild; BiTree rchild; String data; } public class BiTreeTest { static Scanner scanner = new Scanner(System.in); // test c…
1.题目描述 2.分析 对于树来说,由于其结构是递归定义的,所以对二叉树很多算法使用递归是最容易的.反倒是使用循环方式需要借助特殊的数据结构来实现. 3.代码 vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; if( root == NULL ) return ans; inorder(root,ans); return ans; } void inorder(TreeNode* root, vector…
题意: N个点形成一棵树.给出根结点P还有树结构的信息. 输出每个点的F[i].F[i]:以i为根的所有子结点中编号比i小的数的个数. 0<n<=10^5 思路: 方法一:直接DFS,进入结点x时记录一下比x小的数的个数.出来x时记录一下比x小的数的个数.相减就是F[x].结合树状数组. 方法二:写下DFS序.对DFS序列建线段树.然后从小到大对结点进行插入.用线段树统计. 代码:(方法一) int const N=1e5+5; int n,p; vector<int> G[N];…
前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用数组模拟栈,假设有节点个数不超过32个 TreeNode[] stack = new TreeNode[32]; for(int i =0;i<32;i++){ stack[i] = null; } int index =0; TreeNode pnode = root; while(pnode!=nu…
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或找出结点位置,或是执行对结点的其他操作.遍历二叉树的过程实质是把二叉树的结点进行线性排列的过程.假设遍历二叉树时访问结点的操作就是输出结点数据域的值,那么遍历的结果得到一个线性序列. 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次…
首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树…
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode…
  在上一篇博客中,实现了Java中二叉树的三种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似,也简单一些,但是后序遍历需要两个栈来进行辅助,稍微复杂一些.   同样是那棵二叉树 前序遍历:4 2 1 3 6 5 7 8 10 中序遍历:1 2 3 4 5 6 7 8 10 后序遍历:1 3 2 5 10 8 7 6 4 import java.util.Stack; public class Tr…
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {…
一 广度优先遍历(BFS) //广度优先遍历二叉树,借助队列,queue public static void bfs(TreeNode root){ Queue<TreeNode> queue = new LinkedList<TreeNode>(); //队列需要使用linkedlist来初始化 if(root == null) return; queue.add(root); while(!queue.isEmpty()){ TreeNode node = queue.pol…
import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) { if (t == null) { retur…
import java.util.LinkedList; import java.util.Stack; public class BinarySearchTree1<E extends Comparable <? super E>>{ private static class BinaryNode<E> { E element; BinaryNode<E> left; BinaryNode<E> right; BinaryNode(E theE…
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式.简单应用.怎样推断两颗二叉树是否类似 二叉树分为 :1.全然二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1.且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点…
前序遍历:1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历:1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历:1.后序遍历左子树 2.后序遍历右子树 3.访问根节点--------------------- package design; import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; public class BinTree { char data; Bin…
二叉树类: package com.antis.tree; public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类 { this.data = data; left = null; right = null; } /** * 向二叉树中插入子节点 * @param root * @param da…
给定一棵二叉树,找到两个节点的最近公共父节点(LCA).最近公共祖先是两个节点的公共的祖先节点且具有最大深度.假设给出的两个节点都在树中存在. dfs递归写法 查找两个node的最近公共祖先,分三种情况: 如果两个node在root的两边,那么最近公共祖先就是root. 如果两个node在root的左边,那么把root的左子树作为root,再递归. 如果两个node在root的右边,那么把root的右子树作为root,再递归. 深度优先遍历二叉树,一旦找到了两个节点其中的一个,就将这个几点返回给…
1.二叉树的建立 首先,定义数组存储树的data,然后使用list集合将所有的二叉树结点都包含进去,最后给每个父亲结点赋予左右孩子. 需要注意的是:最后一个父亲结点需要单独处理 public static TreeNode root; //建立二叉树内部类 class TreeNode{ public Object data; //携带变量 public TreeNode lchild,rchild; //左右孩子 public TreeNode() { data = null; lchild…
基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点(Child):若A结点是B结点的父结点,则称B结点是A结点的子结点:兄弟结点(Sibling):具有同一个父结点的各结点彼此是兄弟结点:路径和路径长度:从结点n1到nk的路径为一个结点序列n1,n2,…,nk.ni是ni+1的父结点.路径所包含边的个数为路径的长度:祖先结点(Ancestor):沿…
C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue.c : 循环队列的相关操作函数定义.BinTree.c : 二叉树的相关操作的函数定义,层序序列生成二叉树,二叉树的前序序列.中序序列.后序序列的递归和非递归实现,求叶子结点的递归与非递归实现,求树高.由于我还是学生(初学者)且第一次写类似的博客,文章中难免会有错误!如发现错误,望各路大神能够指出!…
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h> #include <iostream> #include <stack> using namespace std; struct BTNode { int value; struct BTNode *left, *right; BTNode(int value_) :value(…
要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于中序.后序的遍历运算要求采用非递归的方式实现. 写在前面 二叉树向量存储的优势和弊端 二叉树同样有两种存储方式,数组和链式存储,对于数组来说,我们利用二叉树的性质然后利用下标可以方便的找到一个节点的子节点和父节点. 二叉树的性质: 1.二叉树的第i层上至多有2i-1个节点 2.深度为K的二叉树至多有…