body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

//红色部分表示前驱和后继
二叉树输入过程:ABDH##I##EJ###CF##G## 前序遍历:ABDHIEJCFG
前序遍历: abc 前序遍历:ABCDEF
#include<iostream>
using namespace std;
enum TBT{child=0,thread};
typedef struct tbt
{
        struct tbt* lchild;
        enum TBT ltag;
        char data;
        enum TBT rtag;
        struct tbt* rchild;
}TBTreeNode,*pTBTree;
int createThreadedBinaryTree(pTBTree& root);
void preorderThreadingBinaryTree(const pTBTree& root,TBTreeNode*&pre);
void preorderThreadedBinaryTreeTraversal(pTBTree root);
int main()
{
        TBTreeNode* root = nullptr;
        int ret = createThreadedBinaryTree(root);
        if(0==ret)
        {
                TBTreeNode* pre = nullptr;
                preorderThreadingBinaryTree(root,pre);
                cout<<"preorder traversal Threaded Binary Tree:"<<endl;
                preorderThreadedBinaryTreeTraversal(root);
                cout<<endl;
        }
        system("pause");
}

int createThreadedBinaryTree(pTBTree& root)
{
        char data;
        if(cin>>data)
        {
                if('#'==data)
                {
                        root = nullptr;
                        return -1;
                }
                root = new TBTreeNode();
                root->data = data;
                createThreadedBinaryTree(root->lchild);
                createThreadedBinaryTree(root->rchild);
        }
        return 0;
}
void preorderThreadingBinaryTree(const pTBTree& root,TBTreeNode*&pre)
{
        if(nullptr==root)
                return ;
/*  参考前序遍历
        cout<<root->data;
        preorderTraversal(root->lchild);
        preorderTraversal(root->rchild);
*/
        // 访问顺序:根结点,左子树,右子树
        //pre永远指向当前访问结点root的前一个访问过的结点,初始为null
        if(nullptr==root->lchild)
        {
                root->lchild = pre;
                root->ltag = thread;
        }
        if(nullptr!=pre&&nullptr==pre->rchild)
        {  //要线索化一个结点的后继,按照前序遍历顺序,只能访问到root的时候才能线索化前一个结点pre的后继,前提pre要不是null,并且没有右子树
                pre->rchild = root;
                pre->rtag = thread;
        }
        pre = root;
        //区别于中序线索化二叉树,因为当前结点先访问到,同时给线索化了
        //所以下面访问左右子树就要判断一下是真的有左右子树而不是线索化的前驱后继
        if(child==root->ltag)
        {
                preorderThreadingBinaryTree(root->lchild,pre);
        }
        if(child==root->rtag)
        {
                preorderThreadingBinaryTree(root->rchild,pre);
        }
}

void preorderThreadedBinaryTreeTraversal(pTBTree root)
{
        if(nullptr==root)
                return ;
        while(nullptr!=root)
        {
                while(nullptr!=root->lchild&&
                        child==root->ltag)
                {
                        cout<<root->data<<" ";  //访问根结点
                        root = root->lchild;  //继续访问左子树
                }
                //左子树的最左边结点
                cout<<root->data<<" ";
                //通过后继遍历下一个要访问的结点
                while(thread==root->rtag)  //当前结点有后继
                {
                        cout<<root->rchild->data<<" ";  //输出后继
                        root = root->rchild;  //更新根结点
                }
                //如果结点没有后继,那么就是有右子树
                //针对这样的情况,先判断当前结点有没有左子树,有就更新根结点先遍历左子树
                if(child==root->ltag)
                        root = root->lchild;
                //没有就遍历右子树
                else
                        root = root->rchild;
        }
}

图解前序遍历线索化二叉树,前序线索二叉树遍历,C\C++描述的更多相关文章

  1. 图解中序遍历线索化二叉树,中序线索二叉树遍历,C\C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. C#数据结构-线索化二叉树

    为什么线索化二叉树? 对于二叉树的遍历,我们知道每个节点的前驱与后继,但是这是建立在遍历的基础上,否则我们只知道后续的左右子树.现在我们充分利用二叉树左右子树的空节点,分别指向当前节点的前驱.后继,便 ...

  3. 线索化二叉树的构建与先序,中序遍历(C++版)

    贴出学习C++数据结构线索化二叉树的过程, 方便和我一样的新手进行测试和学习 同时欢迎各位大神纠正. 不同与普通二叉树的地方会用背景色填充 //BinTreeNode_Thr.h enum Point ...

  4. 后序线索化二叉树(Java版)

    前面介绍了前序线索化二叉树.中序线索化二叉树,本文将介绍后序线索化二叉树.之所以用单独的一篇文章来分析后序线索化二叉树,是因为后序线索化二叉树比前序.中序要复杂一些:另外在复习线索化二叉树的过程中,大 ...

  5. 数据结构与算法---线索化二叉树(Threaded BinaryTree)

    先看一个问题 将数列 {1, 3, 6, 8, 10, 14  } 构建成一颗二叉树 问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8 ...

  6. YTU 3026: 中序线索化二叉树

    原文链接:https://www.dreamwings.cn/ytu3026/2896.html 3026: 中序线索化二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: ...

  7. JAVA递归实现线索化二叉树

    JAVA递归实现线索化二叉树 基础理论 首先,二叉树递归遍历分为先序遍历.中序遍历和后序遍历. 先序遍历为:根节点+左子树+右子树 中序遍历为:左子树+根节点+右子树 后序遍历为:左子树+右子树+根节 ...

  8. LeetCode 590. N叉树的后序遍历(N-ary Tree Postorder Traversal)

    590. N叉树的后序遍历 590. N-ary Tree Postorder Traversal 题目描述 给定一个 N 叉树,返回其节点值的后序遍历. LeetCode590. N-ary Tre ...

  9. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

随机推荐

  1. Mac Anaconda 安装

    下载地址 https://www.anaconda.com/download/#macos 选择对应的python 版本 安装 一路下一步 安装后打开如下 呵呵,此处装完,我的python 环境又从3 ...

  2. HTML第七章总结

    Getting started with CSS 前言 CSS 的 rule 作者做了一个非常形象的比喻,将 CSS 必做 renovate the house,在这里,CSS 包括了三个部分: Se ...

  3. Arduino 数字函数总结

    Arduino 有三个数字函数,分别是:pinMode( ), digitalWrite( ),digitalRead( ).三个函数各有其作用,pinMode( ) 在初始化 setup( )函数中 ...

  4. 卡方分布 | t检验 | F检验 | 卡方检验 | 假设检验 | 各种检验持续总结

    Chi-square distribution introduction 这个视频真的好,完美地解释了卡方统计量是怎么来的! 我们有一个标准正态分布的总体,我们从其中抽一次,取该值的平方就是Q1统计量 ...

  5. 快速幂的求解-java方法(int范围之内)

    思想就是,将十进制数化成二进制数.其它就是很简单了. 如:2的11次幂,11的二进制位1011,所以2(11) = 2(2(0) + 2(1) + 2(3)); 具体实现步骤,看代码比较简单 impo ...

  6. 完整的Django入门指南学习笔记3

    前言 在本节课中,我们将深入理解两个基本概念: URLs 和 Forms.在这个过程中,我们还将学习其它很多概念,如创建可重用模板和安装第三方库.同时我们还将编写大量单元测试. 如果你是从这个系列教程 ...

  7. linux下对数据库操作

    1. mysql -udev -pxxxxxxx // 备注:-u 用户名 -p 密码 2. show databases; // 查看有哪些数据库 3. use datebase; // 使用哪些数 ...

  8. Python之深浅copy与字符编码

    一.深浅copy 1. 首先看赋值运算 l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barr ...

  9. java XML(可扩展标记语言)

    XML 是EXtensible Markup Language的缩写,它是一种类似于HTML的标记语言,称为可扩展标记语言,传输数据而不是显示数据,可以自定义标签,具有自我描述性是一种通用的数据交换格 ...

  10. CRM BP SEARCH 优化

    出于方便的目的,这边将BU_GROUP,SALE_ORG加到了BP搜索里面,因为CRM项目推广了很多国家,每个国家一个SALE ORG,而标准的BP HEADER ADV SEARCH里竟然没有BU_ ...