!!!树的中序,前序线索化遍历

=====

笔记另写:

======

code:

class A{
public:
///inorderMorrisTraversal
    void inorderMorrisTraversal(TreeNode *root){
        TreeNode *curr = root;
        TreeNode *prev = nullptr;
        while(curr!=nullptr){
            if(curr->left == nullptr){
                cout<<curr->val<<" ";
                curr = curr->right;
            }else{
                ///search predecessor
                prev = curr->left;
                while(prev->right !=nullptr && prev->right!=curr){
                    prev = prev->right;
                }
                if(prev->right==nullptr){
                    prev->right = curr;
                    curr = curr->left;
                }else{
                    prev->right = nullptr;///recover the tree
                    cout<<curr->val<<" ";
                    curr = curr->right;
                }
            }///if-else
        }///while
    }
};

=== 前序线索化

///
    void preMorris(TreeNode* root){
        TreeNode *curr = root;
        TreeNode *prev = nullptr;
        while(curr!=nullptr){
            if(curr->left==nullptr){
                cout<<curr->val<<" ";
                curr = curr->right;
            }else{
                prev = curr->left;
                while(prev->right!=nullptr && prev->right!=curr){
                    prev = prev->right;
                }
                if(prev->right==nullptr){
                    prev->right = curr;
                    cout<<curr->val<<" ";
                    curr = curr->left;
                }else{
                    prev->right = curr;
                    curr = curr->right;
                }
            }
        }///while
    }
时间: 2024-10-10 01:59:54

!!!树的中序,前序线索化遍历的相关文章

java实现线索化二叉树的前序、中序、后续的遍历(完整代码)

java实现线索化二叉树的前序.中序.后续的遍历 比如创建一个二叉树 1 / 3 6 / \ / 8 10 14 线索化二叉树几个概念: n个节点的二叉链表中含有n+1 [公式2n-(n-1)=n+1]个空指针域.利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加指针成为线索).如下面的就是6+1=7个空指针域 (8,10,14各有连个指针没有指向 6有一个) 加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树.分为前序线索二叉树.中序线索二叉树.

数据结构之二叉树(前序 中序 后续线索话非递归方式)

节点: enum LinkType {                  THREAD,                  LINK }; template<class T> struct ThredBinaryNode {                  ThredBinaryNode *_left;                  ThredBinaryNode *_right;                  LinkType _left_tag;                 

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

二叉线索树-创建中序二叉线索树、查找前驱、查找后继、按照前驱或后继遍历

#include <iostream> #include <stack> using namespace std; struct BiThrNode { int data; BiThrNode *left; BiThrNode *right; bool ltag;//0表示left指向左子,1表示left指向直接前驱 bool rtag; //BiThrNode(int val,BiThrNode *l,BiThrNode *r,bool lt,bool rt):data(val)

数据结构之二叉树 (构造 拷贝构造 以及前序中序后续三种遍历方法)

首先二叉树的节点定义如下: struct BinaryNode {                  BinaryNode *_left;                  BinaryNode *_right;                  T _data;                 BinaryNode( T data ) :_data(data), _left( NULL), _right(NULL )                 {}; }; 二叉树的结构以及接口如下 te

树的中序遍历

中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问. 1.递归实现 void inOrder(BinTree* root) { if(root!=NULL) { inOrder(root->lchild); cout<<root->data; inOrder(root->rchild); } } 2.非递归实现 对于任一结点P, 1)若其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前结点P再进行相同的处理: 2)若其左孩子为空,则取栈顶元素并进行出栈操作,访

线索化 - 遍历思想,流程,代码

1.前言 普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得. 若可将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快"顺藤摸瓜"而遍历整个树了. 二叉线索树思想是干什么的? 中序遍历这棵树===>转换成链表访问 2线索化思想 结论:线索化过程就是在遍历过程(假设是中序遍历)中修改空指针的过程: 将空的lchild改为结点的直接前驱: 将空的rchild改为结点的直接后继. 3线索化思想 请将此树线索化. 1)右空指针线索化: 2

Morris Traversal: 非递归不用栈实现对树的中序遍历

参考:http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ <pre name="code" class="plain">1. Initialize current as root 2. While current is not NULL If current does not have left child a) Print cu

二叉树的前序、中序、后序线索化及遍历

前序线索化: void _PrevOrderThreading(Node *cur, Node *& prev) {     if(cur == NULL)     {         return;     }          if(cur->_left == NULL)     {         cur->_leftTag == THREAD;         cur->_left = prev;     }     if(prev && prev->