zoukankan      html  css  js  c++  java
  • 线索二叉树的构造

    首先明确线索二叉树的概念,线索二叉树是原本二叉树n个节点中未分配的n-1个孩子指针改为线索指针,左孩子指向前驱结点,右孩子指向后继节点。

    中序线索二叉树的构造就要明确中序遍历:

    #include<iostream>
    using namespace std;
    struct BiTree{
        int date;
        BiTree*lchild,*rchild;
        int ltag,rtag;//如果左孩子是线索则ltag为1
    };
    void visit(BiTree*t){//visit函数
        cout<<t->date;
    }
    void InOrder(BiTree*T){//中序遍历
        if(T){
            InOrder(T->lchild);
            visit(T);
            InOrder(T->rchild);
        }
    }

    以上代码将输入中序遍历的序列,修改添加以下代码:

    void InOrder(BiTree*&T,BiTree*&pre){//既然要修改指针的指向,那就一定要用指针的引用
        if(T){
            InOrder(T->lchild,pre);
            if(T->lchild==NULL)//表示指向左子树的指针没有使用,可以用于指向前驱结点
            {
                T->lchild=pre;//改为指向其前驱结点
                T->ltag=1;
            }
            if(pre!=NULL&&pre->rchild==NULL){
                pre->rchild=T;
                pre->rtag=1;
            }
            pre=T;
            visit(T);
            InOrder(T->rchild,pre);
        }
    }

    函数只是对没有使用的指针做了修改,结果仍然输出的是中序序列,所以函数对二叉树的线索化也是沿着中序遍历的顺序进行的。同理可以写出先序遍历和后序遍历的线索化。

    注意:对于最后一个节点,并没有对其线索化,在主函数中要单独修改。

  • 相关阅读:
    内存管理实验
    浅谈RAM和ROM的各种区别
    课程总结
    IO流
    事件处理
    继承
    第四次上机作业
    第三次上机
    Java基础实训1
    Java第二次作业
  • 原文地址:https://www.cnblogs.com/kalicener/p/13445373.html
Copyright © 2011-2022 走看看