二叉树的定义:
由于在二叉树的链式存储结构中,每个结点存储了指向其左右孩子结点的链,而没有存储指向某种线索性次序下的前驱或者后继结点的链。当需要获得结点在一种遍历序列中的前驱或者后继结点时。有俩中解决方案:
(1)再进行一次遍历,寻找前驱或后继结点。这需要花费较多的时间,效率较低。(2)采用多重链表结构,每个结点增加俩条链,分别指向前驱和后继结点。需要花费较多的存储空间。因此,引入线索二叉树。
在二叉树的二叉链表表示中,若结点的子树为空,则指向孩子的链为空值。具有N个结点的二树,共2N条链,其中N-1条链表示各结点之间的关系,n+1条链为空。 线索二叉树利用这些空链存储结点在某种遍历次序子下的前驱和后继关系,即原有非空的链保持不变,仍然指向该结点的左右孩子结点;空left域指向前驱结点,空right域指向后继结点。指向前驱和后继结点的链统称为线索。 为了区分每条链到底指向孩子结点还是线索,每个结点需要增加俩个链标记itaghe rtagitag = 0 left 指向左孩子itag = 1 left 为线索指向前驱结点rtag = 0 right 指向右孩子rtag = 1 right 为线索指向后继结点总之就是有孩子的是0,没孩子是1指向前驱结点或后继结点。
#include<iostream>
using namespace std;
template <class T>
class ThreadBinaryNode //线索二叉树的二叉链表结点类,T指定结点的元素类型
{
public:
T data;
ThreadBinaryNode<T> *left,*right; //指针域指向左右孩子结点
int ltag, rtag; //左右线索标志
ThreadBinaryNode<T> (T data,ThreadBinaryNode<T> *left = NULL, ThreadBinaryNode<T> *right = NULL)
{
this ->data =data;
this ->left = left;
this ->right = right;
this ->ltag = this -> rtag = 0;
}
};
中序线索二叉树
二叉树中的中序线索化: 对一棵二叉树进行中序线索化,就是在遍历二叉树时为每个结点添加线索和链标记。
(1)已知一棵二叉树采用具有线索二叉树结点的二叉链表存储,root指向根结点,每个结的left、、right域指向左右孩子结点,线索标记为0。
(2)设p指向