后序二叉线索树的遍历

    xiaoxiao2021-03-25  75

    网上关于后序线索二叉树的生成已经有很多相关的代码,但是很少有利用后序线索二叉树的线索来进行后序遍历的代码,这是因为后序的线索对于遍历用处不大,不如直接用递归生成遍历算法,而且要采用后序线索来产生遍历的话,一定要有一个指向其父节点的域,还有一个判断是否已经访问过的域。

    struct Node { int val; //值 Node* Left; //左子树 Node* Right; //右子树 Node* parent; //父节点 bool left_tag; //标志左子树,是线索还是儿子 bool right_tag; //标志右子树,是线索还是儿子 int visted = 0; //是否已经访问过 };

    因为网上关于怎么生成后序线索二叉树已经很多了,这里就不说了,直接上代码

    void Tree::Postorder(node cur, node&pre) { if (cur == nullptr) return ; Tree::Postorder(cur->Left, pre); Tree::Postorder(cur->Right, pre); if (cur->Left==nullptr) { cur->left_tag = false; cur->Left = pre; } if (pre&&pre->Right == nullptr) { pre->right_tag = false; pre->Right = cur; } pre = cur; }

    下面就是利用后序线索来遍历:

    void Tree::Postshow(node cur) { while (cur) { if (cur->left_tag&&cur->Left->visted == 0 && cur->visted != cur->right_tag + cur->left_tag) { cur->visted++;//访问次数加一 cur = cur->Left;//有左子树,并且未访问,且该节点左右都未全部被访问 } else if (cur->right_tag&& cur->Right->visted == 0 && cur->visted != cur->right_tag + cur->left_tag) { cur->visted++;//与上面类似 cur = cur->Right; } else if ((!cur->left_tag && !cur->right_tag) || cur->visted == cur->right_tag + cur->left_tag) { cout << cur->val << " ";//根节点,或左右都已被访问 if (cur->right_tag == false) { cur->visted++;//若有线索,进入线索,访问次数加一 cur = cur->Right; //cur->visted ++; } else { cur->visted++;//回到父节点 cur = cur->parent; } } else { cur->visted++;//这个代码是因为有死循环,留待以后处理,先写个这个将就一下,日后更改,如果没有这个代码就会死循环。 if (cur->visted > 3) cur = cur->parent; } } }

    代码就是上面那样,如果有什么不懂得,可以在下方留言,或者发我邮箱answer3tl@gmail.com

    转载请注明原文地址: https://ju.6miu.com/read-32163.html

    最新回复(0)