基于栈的二叉树的遍历

基于栈的深度优先搜索

基于手写的栈和STL栈的深度优先

//基于系统栈的二叉树的中序遍历
#include <iostream>
#include <stack>
using namespace std;
struct Node
{
    int data;
    Node* left;
    Node* right;
    Node(int val):data(val),left(NULL),right(NULL){};
};

struct Tree
{
    Node* tnode;
    Tree(Node* t):tnode(t){};
    void Add(int val,Node* t){
        if(t == NULL){
            t = new Node(val);
        }
        else{
            if(t->data > val){
                if(t->left == NULL){
                    Node* tmp = new Node(val);
                    t->left = tmp;
                }
                else{
                    Add(val,t->left);
                }
            }
            else{
                if(t->right == NULL){
                    Node* tmp = new Node(val);
                    t->right = tmp;             //千万注意别写错了
                }
                else{
                    Add(val,t->right);
                }
            }
        }
    };

};
void StackTravel(Node* t){
    stack<Node*>  s;
    Node* cur = t;
    while(cur){
        cout<<cur->data<<endl;
        if(cur->right){
            s.push(cur->right);
        }
        if(cur->left){
            cur = cur->left;
        }
        else{
            if(s.empty()){
                cur = NULL;
            }
            else{
                cur = s.top();
                s.pop();
            }
        }
    }
}
void Print(Node* t){
    if(t){
        cout<<t->data<<endl;
        Print(t->left);
        Print(t->right);
    }
}
int main(int argc, char const *argv[])
{
    int arr[10] = {5,6,0,9,3,8,1,2,7,4};
    Tree* tree = NULL;
    Node* root = NULL;
    for(int i = 0;i < 10;i++){
        if(i == 0){
            root = new Node(arr[i]);
            tree = new Tree(root);              //前面是申明,这里用之前必须开辟空间了
            tree->tnode = root;
        }
        else{                       //两条路,必须加else
        tree->Add(arr[i],root);
        }
    }
    Print(root);
    StackTravel(root);
    return 0;
}
//手写的栈的二叉树的遍历
#include <iostream>
using namespace std;
struct TreeNode
{
    int data;
    int position;
    TreeNode* left;
    TreeNode* right;
    TreeNode(){};
    TreeNode(int value,int pos):data(value),position(pos), left(NULL),right(NULL){};
};
class BinarySearchTree
{
private:
    TreeNode* tnode ;
public:
    BinarySearchTree(TreeNode* t):tnode(t){};
    ~BinarySearchTree(){delete tnode;tnode = NULL;};
    void Add(int value,int position,TreeNode* t);
    void Print(TreeNode* tnode);    //中序

};
void BinarySearchTree::Add(int value,int position,TreeNode* t){
    if(t== NULL) {
        TreeNode* root = new TreeNode(value,position);
        t = root;
    }
    else{

        if(value < t->data){
            if(t->left == NULL){
                TreeNode* tmp = new TreeNode(value,position);
                t->left = tmp;
            }
            else{
                Add(value,position,t->left);
            }

        }
        else{
            if(t->right == NULL){
                TreeNode* tmp = new TreeNode(value,position);
                t->right = tmp;
            }
            else{
                Add(value,position,t->right);
            }

        }
    }
}
void BinarySearchTree::Print(TreeNode* tnode){
    if(tnode){  //if不是while
        Print(tnode->left);
        cout<<tnode->data<<endl;
        Print(tnode->right);

    }
}

int Search(TreeNode* t,int target){
    if( t == NULL){
        return -1;
    }
    else if(t->data == target){
        return t->position;
    }
    else if( t->data > target){
        return Search(t->left,target);
    }
    else{
        return Search(t->right,target);
    }
}

//Stack定义
template <class T>
class Node      //class默认是private,struct默认是public
{
public:
    T data;
    Node<T>* next;
    Node(T val):data(val),next(NULL){};
    ~Node(){delete next;next=NULL;};

};
template<class T>
class Stack
{
    Node<T>* top;
public:
    Stack():top(NULL){};
    void Pop();
    void Push(T val);
    bool IsEmpty();
    T TopVal();
    ~Stack(){delete top;top = NULL;};

};
template<class T>
void Stack<T>::Push(T val){
    Node<T>* tmp = new Node<T>(val);
    tmp->next = top;
    top = tmp;
}
template <class T>
void Stack<T>::Pop(){
    if(top == NULL){
        cout<<"Stack is empty!"<<endl;
        return ;
    }
    else{
        Node<T>* tmp = top;
        top = top->next;
        delete tmp;
        tmp = NULL;
    }
}
template <class T>
bool Stack<T>::IsEmpty(){
    return top == NULL;
}
template <class T>
T Stack<T>::TopVal(){
    return top->data;
}

void PreOrderStack(TreeNode* t){
    Stack<TreeNode*>* s =new Stack<TreeNode*>() ;
    TreeNode* cur = t;
    while(cur){
        cout<<cur->data<<endl;
        if(cur->right){
            s->Push(cur->right);
        }
        if(cur->left){
            cur = cur->left;
        }
        else{
            if(s->IsEmpty()){
                cur = NULL;
            }
            else{
                cur = s->TopVal();
                s->Pop();
            }
        }
    }
}
int main(int argc, char const *argv[])
{
    int arr[5] = {3,6,4,2,0};
    TreeNode* root = NULL;
    BinarySearchTree* bst  = NULL;
    for(int i = 0;i < 5;i++){
        if(i == 0){
            root = new TreeNode(arr[0],i);
        }
        else{
            bst->Add(arr[i],i,root);
        }
    }
    //bst->Print(root);
    //cout<<Search(root,0)<<endl;
    PreOrderStack(root);
    return 0;
}

原文地址:https://www.cnblogs.com/ziyuemeng/p/12424013.html

时间: 2024-07-31 10:18:08

基于栈的二叉树的遍历的相关文章

二叉树的遍历(基于栈的非递归方式实现)

在写二叉树的时候如果用递归实现二叉树的遍历很简单,但是用非递归来实现二叉树的遍历就不那么简单了需要一些技巧. 那为什么还要非递归实现呢?个人理解:如果树的高度很大,超过了允许递归的次数,那么就会出错,比如我记得python只允许递归100次(不知道记错没) 这时候用迭代就要保险的多,不会出错. 下面先来做基本的准备说明: 1 #include<iostream> 2 #include<stack> 3 4 #define null NULL 5 6 template<type

二叉树高度,以及栈实现二叉树的先序,中序,后序遍历的非递归操作

求解二叉树的高度 树是递归定义的,所以用递归算法去求一棵二叉树的高度很方便. #include <iostream> #include <cstdio> using namespace std; struct Node { char data; Node *lchild; Node *rchild; }; void High(Node *T, int &h) { if (T == NULL) h = 0; else { int left_h; High(T->lchi

栈实现二叉树的先,中,后序遍历

栈实现二叉树先,中,后序遍历 如果是使用递归来实现二叉树的先,中,后序遍历只需要更改三行代码的位置,但若是使用栈来写那便会有趣得多 根结点与其左右子树间的输出优先级 graph TD 1((根结点))---2((左子树)) 1---3((右子树)) 遍历方式 输出优先级 先序 根结点>左子树>右子树 中序 左子树>根结点>右子树 后序 左子树>右子树>根节点 使用栈的规则 栈内元素是指向结点的指针 只有栈顶元素指向的结点内容才会被输出 方便,不用记忆太多结点 结点内容输

【树4】二叉树的遍历

简介 遍历二叉树就是按照某种顺序,将树中的结点都枚举一遍,且每个结点仅仅访问一次.因为树不是线性的结构,遍历不像线性表那样简单,因此他的遍历需要特点的算法来完成. 从某种角度讲,对二叉树的遍历就是将树形结构转换为线性结构的操作. 二叉树的遍历方法主要有如下几种: 先序遍历:先访问root结点,再先序遍历左子树,再先序遍历右子树. 中序遍历:先中序遍历左子树,再访问root结点,再中序遍历右子树. 后序遍历:先后序遍历左子树,再后序遍历右子树,再访问root结点. 层遍历:从上到下,从左到右,一层

【转】算法之二叉树各种遍历

http://blog.csdn.net/sjf0115/article/details/8645991 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆或是二叉排序树.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的 i -1次方个结点:

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构——二叉树的遍历

"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点,子节点有左右之分. 2)存储结构 二叉树的存储结构能够採用顺序存储,也能够採用链式存储,当中链式存储更加灵活. 在链式存储结构中,与线性链表类似,二叉树的每一个结点採用结构体表示,结构体包括三个域:数据域.左指针.右指针. 二叉树在C语言中的定义例如以下: struct BiTreeNode{ int c;

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历

typedef int ElemType; typedef struct BitNode { ElemType data; //数据域 struct BitNode *lchild, *rchild; //左右孩子指针 }BitNode,*BitTree; void visit(BitNode *b) { printf("%d ", b->data); } //无论采用哪种遍历方法,时间复杂度都是O(n),因为每个结点都访问一次且仅访问一次,递归工作栈的栈深恰好为树的深度,空间复

C++ 二叉树深度优先遍历和广度优先遍历

二叉树的创建代码==>C++ 创建和遍历二叉树 深度优先遍历:是沿着树的深度遍历树的节点,尽可能深的搜索树的分支. //深度优先遍历二叉树void depthFirstSearch(Tree root){ stack<Node *> nodeStack; //使用C++的STL标准模板库 nodeStack.push(root); Node *node; while(!nodeStack.empty()){ node = nodeStack.top(); printf(format, n