《数据结构》复习笔记--二叉树2

二叉树的非递归遍历:

中序遍历非递归遍历算法

非递归算法实现的基本思路:使用堆栈:

void InOrderTraversal( BinTree BT )
{
    BinTree T=BT;
    Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
    while( T || !IsEmpty(S) )
    {
        while(T)  /*一直向左并将沿途结点压入堆栈*/
        {
            Push(S,T);
            T = T->Left;
        }
        if(!IsEmpty(S))
        {
            T = Pop(S); /*结点弹出堆栈*/
            printf(“%5d”, T->Data); /*(访问)打印结点*/
            T = T->Right; /*转向右子树*/
        }
    }
}

void InOrderTraversal( BinTree BT )
{
    BinTree T=BT;
    Stack S = CreatStack( MaxSize ); /*创建并初始化堆栈S*/
    while( T || !IsEmpty(S) )
    {
        while(T)  /*一直向左并将沿途结点压入堆栈*/
        {
            Push(S,T);
              printf(“%5d”, T->Data); /*(访问)打印结点*/
            T = T->Left;
        }
        if(!IsEmpty(S))
        {
            T = Pop(S); /*结点弹出堆栈*/
            T = T->Right; /*转向右子树*/
        }
    }
}

void PostOrder_NoRecurse(BinTree BT, void (*Do)(BinTree))//非递归实现后序遍历
{
    BinTree T = BT;
    Stack s = CreateStack(20);
    int Tag[20];   //Tag用来标记第几次遇到堆栈内的元素,本身是一个整形堆栈
    while(T || !Stack_IsEmpty(s))
    {
        while(T)    //每遇到一个新元素,则到控制到此处
        {
            Stack_Push(s, T); //放入堆栈并循环至其最左
            Tag[s->size - 1] = 0;
            T = T->Left;
        }
        while (!T && !Stack_IsEmpty(s))
        {
            T = Stack_Pop(s); //取出堆栈中的一个元素,并判断它的Tag
            if(Tag[s->size])
            {
                (*Do)(T);   //Tag != 0 说明是第三次遇见该节点,对它进行操作
                T = 0;        //将T设为0以触发While条件,继续循环
            }
            else            //Tag = 0 说明是第二次遇见(第一次是将Tag设为0)
            {
                if (!T->Right) (*Do)(T);   //如果右儿子不存在,则直接输出
                else
                {
                    Stack_Push(s, T);      //如果右儿子存在,则将它放回堆栈
                    Tag[s->size - 1]++;        //并累加相应的Tag
                }
                T = T->Right;  //返回右儿子。注意,如果右儿子不存在,则会触发While继续循环
            }                   //否则会判定为遇见新元素跳出循环,继续外部外部的大While循环
        }
    }
}

由两种遍历序列确定二叉树?

已知三种遍历中的任意两种遍历序列,能否唯一确定一棵二叉树呢?我们知道,无论哪一种,必须要先知道先序遍历。

比如:先序和中序遍历序列来确定一棵二叉树

〖分析〗

1根据先序遍历序列第一个结点确定根结点;

2根据根结点在中序遍历序列中分割出左右两个子序列

3对左子树和右子树分别递归使用相同的方法继续分解。

题目练习:过几天再贴上。

时间: 2024-10-10 15:20:44

《数据结构》复习笔记--二叉树2的相关文章

《数据结构》复习笔记--二叉树1

二叉树: 在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2^(i-1)个结点:深度为k的二叉树至多有2^k-1个结点:对任何一棵二叉树T,如果其终端结点数为n1,度为2的结点数为n2,则n1=n2+1 一棵深

《数据结构复习笔记》--二叉搜索树

二叉搜索树:维基百科:click here 二叉查找树(Binary Search Tree),也称二叉搜索树.有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes

数据结构复习笔记--数组

最后还是决定在未来的道路上走向软件开发者这条路,从现在重新复习数据结构和算法. 关于数组有几个比较有意思的特点. 1.对于数组 int List[3],编译器将List[i]解释为指向一个地址为List + i*sizeof(int)的整数的指针. 对于int * List, int *List2[5],两个都是指向int 类型的变量,但是编译器会为后者分配五个整数存储空间. List2实际是上指向List2[0],List2 + i 实际上是&List2[i].在C语言中是不需要加上偏移量的.

《数据结构复习笔记》--哈夫曼树,哈夫曼编码

先来了解一下哈夫曼树. 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值 wk,从根结点到每个叶子结点的长度为 lk,则每个叶子结点的带权路径长度之和就是: 最优二叉树或哈夫曼树: WPL最小的二叉树. [例]有五个叶子结点,它们的权值为{1,2,3,4,5},用此权值序列可以构造出形状不同的多个二叉树. 其中结果wpl最小值的是:33=(1+2)*3+(3)*2+(4+5)*2: 哈夫曼树的构造: 每次把权值最小的两棵二叉树合并, 代码: typedef struct Tr

《数据结构复习笔记》--堆

把堆的相关知识在复习一下.加深理解 堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前, 先来了解一下二叉堆. 二叉堆的定义 二叉堆是完全二叉树或者是近似完全二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆.当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆.下图展示

数据结构复习之二叉树的非递归先序,中序,后序遍历

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<stack> using namespace std; struct Tree{ int x; Tree *lchild, *rchild; Tree(){ lchild = rchild = NULL; } }; typedef Tree* pT; void buildT(pT &

《数据结构》复习之二叉树

二叉树的性质 1满二叉树和完全二叉树 2二叉树的主要性质 二叉树的数据结构 二叉树的算法 补充 总结 1.二叉树的性质 1.1满二叉树和完全二叉树 在一棵二叉树中,如果所有的分支节点都有左孩子和右孩子,并且叶子节点都集中在二叉树的最下一层,则这样的二叉树被称为满二叉树. 如果一棵深度为k有n个节点的二叉树进行编号后,各结点的编号与深度为k的满二叉树中相同位置山的结点的编号军相投,那么这棵二叉树就是一颗完全二叉树. 1.2二叉树的主要性质 总分支数=总结点数-1(这条结论对任何树都适用,不止是二叉

2014年软考程序员-常考知识点复习笔记【第二章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  二叉树三种遍历的非递归算法(背诵版) 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void PreOrderU

2014年软考程序员-常考知识点复习笔记【第三章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  2.线性表 (1) 性表的链式存储方式及以下几种常用链表的特点和运算:单链表.循环链表,双向链表,双向循环链表. (2)单链表的归并算法.循环链表的归并算法.双向链表及双向循环链表的插入和删除算法等都是较为常见的考查方式. (3)单链表中设置头指