美文网首页
二叉树中序线索化以遍历

二叉树中序线索化以遍历

作者: 动感新势力fan | 来源:发表于2018-05-16 18:02 被阅读15次
#include <iostream>
using namespace std;
enum Tag{
    Link,
    Thread
};
struct Node{
    char data;
    Node *left;
    Node *right;
    Tag lTag;
    Tag rTag;
};
typedef Node*  Btree;
/*前序遍历创建二叉树*/
void createTree(Btree &T){
    char ch;
    cin >> ch;
    if(ch == '#')  T = NULL;
    else{
        T = (Btree)malloc(sizeof(Btree));
        T->data = ch;
        T->lTag = Link;
        T->rTag = Link;
        T->left = NULL;
        T->right = NULL;
        createTree(T->left);
        createTree(T->right);
    }
}
/*中序遍历进行中序线索化*/
Btree pre = NULL; /*始终指向刚刚访问过的节点*/
void inThreading(Btree &T){
    if(T == NULL) return;
    inThreading(T->left);
    if(T->left == NULL){
        T->lTag = Thread;
        T->left = pre;
    }
    if(pre && pre->right == NULL){
        pre->rTag = Thread;
        pre->right = T;
    }
    pre = T;
    inThreading(T->right);
}

/*中序遍历*/
void inOrderTraverse(Btree &T){
    if(T == NULL) return;
    inOrderTraverse(T->left);
    printf("%c ", T->data);
    inOrderTraverse(T->right);
}
/*
在中序线索二叉树中,查找结点 *p 的中序后继结点分两种情形:
a). 若 *p 的右子树空 ( 即 p->rtag 为 Thread) ,则 p->rchild 为右线索,直接指向 *p 的中序后继。
b). 若 *p 的右子树非空 ( 即 p->rtag 为 Link) ,则 *p 的中序后继必是其右子树中第一个中序遍历到的结点。
    也就是从 *p 的右孩子开始,沿该孩子的左链往下查找,直至找到一个没有左孩子的结点为止,该结点是 *p 的右子树中 “ 最左下 ” 的结点,即 *P 的中序后继结点。
*/
void inorder(Btree &T){
    /*循环找到中序遍历的第一个节点*/
    Btree cur = T;
    while(cur->lTag == Link){  //这里中序第一个节点的lTag为Thread设置过了
        cur = cur->left;
    }
    while(cur)
    {
        printf("%c ", cur->data);
        if(cur->rTag == Thread) {
            cur = cur->right;
        }
        else{
            cur = cur->right;  // 这个地方要小心
            while(cur && cur->lTag == Link)
            {
                cur = cur->left;
            }
        }
    }
}
int main() {
    cout << "请输入中序遍历的扩展二叉树序列" << endl;
    /*#B#D#A#C#*/
    Btree boot;
    createTree(boot);
    cout << endl;
    /*中序打印*/
    cout << "普通中序遍历" << endl;
    inOrderTraverse(boot);
    cout << endl;
    /*中序遍历进行中序线索化*/
    cout << "中序线索化开始" << endl;
    inThreading(boot);
    cout << "中序线索化结束" << endl;
    /*按照链表的方式进行遍历*/
    cout << "中序线索二叉树遍历" << endl;
    inorder(boot);
    cout<<endl; 
    while(1);
    return 0;
}

相关文章

  • javascript线索化二叉树

    定义二叉树创建方法 对二叉树进行中序线索化 遍历线索二叉树 测试

  • 线索二叉树操作

    树节点 创建中序线索二叉树 遍历中序线索二叉树 创建前序线索二叉树 遍历前序线索二叉树 参考:https://bl...

  • 数据结构与算法13-线索二叉树

    定义 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历...

  • 数据结构与算法[线索化二叉树]

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其...

  • 二叉树—线索二叉树

    1、线索二叉树的引入 在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或...

  • 线索化二叉树的实现

    概念   在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行...

  • 中序建立线索二叉树

    为什么使用中序遍历来建立线索二叉树? 因为中序遍历方便寻找前驱节点和后继节点,而先序遍历不方便找后继节点,后序遍历...

  • 一般二叉树普通二叉树,前、中、后序遍历以及搜索 顺序存储二叉树将数组以树的思想标识,包括前、中、后续遍历 线索化二...

  • 二叉树中序线索化以遍历

  • leecode刷题(29)-- 二叉树的中序遍历

    leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历。 示例: ...

网友评论

      本文标题:二叉树中序线索化以遍历

      本文链接:https://www.haomeiwen.com/subject/bslmdftx.html