二叉搜索树的先序中序后序非递归遍历代码

#include<iostream>
#include<stack>
#include<vector>
using namespace std;
struct node
{
  int val;
  node *left,*right;
  node(int _val):val(_val),left(NULL),right(NULL){
   
  } 
};
struct bignode
{

bool isfirst;
  node* pnode; 
};
void postorder(node* root)
{
 
 stack<bignode*> sta;
 node *p=root;
 while(p!=NULL||!sta.empty())
 {
  while(p)
  {
   bignode *tmp=new bignode();
   tmp->isfirst=true;
   tmp->pnode=p;
   sta.push(tmp);
   p=p->left;
  }
  if(!sta.empty())
  {
   bignode *tmp=sta.top();
   sta.pop();
   if(tmp->isfirst)
   {
    tmp->isfirst=false;
    sta.push(tmp);
    p=tmp->pnode->right;
   }
   else
   {
    cout<<tmp->pnode->val<<" ";
    p=NULL;
   }
  }
 }
}
void preorder(node* root)
{
    stack<node*> sta;
    node* p=root;
    while(p!=NULL||!sta.empty())
    {
     while(p){
  cout<<p->val<<" ";
      sta.push(p);
      p=p->left;
     }
     if(!sta.empty())
     {
      node * tmp=sta.top();
     
      sta.pop();
      p=tmp->right;
     }
     
    }
}
void inorder(node* root)
{
    stack<node*> sta;
    node* p=root;
    while(p!=NULL||!sta.empty())
    {
     while(p){
 
      sta.push(p);
      p=p->left;
     }
     if(!sta.empty())
     {
      node * tmp=sta.top();
      cout<<tmp->val<<" ";
      sta.pop();
      p=tmp->right;
     }
     
    }
}
int main()
{

node n1(1),n2(2),n3(3),n4(4),n5(5),n6(6);
   n1.left=&n2;
   n1.right=&n3;
   n2.left=&n4;
   n2.right=&n5;
   n3.left=&n6;
   inorder(&n1);
 return 1;
}

时间: 2024-10-11 23:12:54

二叉搜索树的先序中序后序非递归遍历代码的相关文章

Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作

什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T extends Comparable<? super T>> { /** * 节点储存的值 */ private T data; /** * 左子节点 */ private Node<T> leftNode; /** * 右子节点 */ private Node<T>

采用二叉搜索树来统计文本中单词出现的频率

把几个主要的函数组合起来即可: 1.从文本读取单个单词(去掉空格,特殊符号等) 2.用读出来的单词去更新搜索二叉树的节点(涉及二叉树的构建问题,递归) 3.中序遍历,来递归打印二叉树的每个节点 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXWORD 1000 //单词出现频率的统计哦 struct tnode { cha

二叉搜索树的后序遍历序列——24

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入数组的任意两个数组都互不相同. 二叉搜索树的特点就是每个结点的左子树的值都比自身的值小,而右子树的值都比自身值要大.比如如上的二叉搜索树后序遍历的结果就是{5,7,6,9,11,10,8},但是题意并不是给出一棵二叉搜索树让判断数组是否为后序遍历序列,而是只有一组数据让判断是否为某个二叉搜索树的后序遍历结果,因此之能依据二叉搜索树后序遍历结果的特点来进行分析判断: 就拿上面的结果来说

【二叉树】二叉搜索树

二叉搜索树: 1.每个节点都有一个关键码(key)作为搜索依据,关键码互不相同. 2.左子树的所有关键码都小于根节点的关键码. 3.右子树的所有关键码都大于根节点的关键码. 4.左右子树都是二叉搜索树. 删除key:左为空,右为空,左右都不空 1)左为空:cur的右树链到父节点 2)右为空:cur的左树链到父节点 3)左右都不空:找右树最左节点或左树最右节点,将找到的节点与cur交换后删除它. 二叉搜索树的增.删.查(非递归及递归)程序代码如下: #pragma once #include<st

二叉树-二叉搜索树(中序)

题型: (1)验证 (2)修复(排列不正确,修复) (3)构造(给排列求树-平衡的:种类) (4)利用性质求第n个结点 二叉搜索树的思路:中序输出+相关操作 如果要求空间复杂度O(1),考虑莫里斯遍历 98. 验证二叉搜索树    面试题 04.05. 合法二叉搜索树 (1) 思路:中序排列,看次序 1 class Solution { 2 public boolean isValidBST(TreeNode root) { 3 // if(root==null){ // 题目空树是true 4

二叉搜索树的后序遍历判断

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 之前对于二叉搜索树,只知道中序遍历是递增的,今天做到这道题目,要求判断数组是不是二叉搜索树后序遍历的结果,一开始有点懵,后来在纸上画画,感觉很像递归的感觉,有一种特别像归并排序的那种感觉一样,然后发现对于每一个树的子结构而言,我们将其分成左右子树两部分就可以很明白这种递归的结构了,分成两部分,然后分别对左右在递归,直到叶子节点 1 public c

《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

(判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道题不禁让人想起用一个普通二叉树的前序(或后序)遍历序列加上中序遍历序列就可以还原一棵二叉树,在那道题中,我们知道前序或后序序列就能开始组织根节点,但是因为我们无法确定子树的个数,所以还需要一个辅助的序列来确定子树范围.但如果改成BST的前序或后序遍历序列,我们就可以直接组织二叉树,BST的特性帮我们

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

算法导论第十二章 二叉搜索树

一.二叉搜索树概览 二叉搜索树(又名二叉查找树.二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search.Maximum.Minimum.Insert.Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成.当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间.这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成.这样的改进结构有AVL(Adelson-Velskii-Landis)