【道德经·第八章】上善若水。水善利万物而不争,处众人之所恶(wù),故几(jī)于道。居善地,心善渊,与善仁,言善信,正善治,事善能,动善时。夫唯不争,故无尤。
线索二叉树
对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。
线索二叉树结构
1 2 3 4 5 6 7 8 9 10
| struct ThreadNode { int data; struct ThreadNode *lchild, *rchild; int ltag, rtag; ThreadNode(int x) : data(x), lchild(nullptr), rchild(nullptr), ltag(0), rtag(0) {
} };
typedef ThreadNode* ThreadTree;
|
中序线索化二叉树
中序线索化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void InThread(ThreadTree& p, ThreadTree& pre) { InThread(p->lchild, pre); if(p->lchild == nullptr) { p->lchild = pre; p->ltag = 1; } if(pre != nullptr && pre->rchild==nullptr) { pre->rchild = p; pre->rtag = 1; } pre = p; InThread(p->rchild, pre); }
|
建立线索化二叉树
1 2 3 4 5 6 7 8
| void CreateInThread(ThreadTree T) { ThreadTree pre = nullptr; if(T != nullptr) { InThread(T, pre); pre->rchild = nullptr; pre->rtag = 1; } }
|
求第一个节点
1 2 3 4
| ThreadNode* FirstNode(ThreadTree p) { while(p->ltag == 0) p = p->lchild; return p; }
|
求后继节点
1 2 3 4
| ThreadNode* NextNode(ThreadNode* p) { if(p->rtag == 0) return FirstNode(p->rchild); else return p->rchild; }
|
不含头结点的中序线索二叉树的中序遍历
1 2 3 4
| void InOrder(ThreadTree T) { for(ThreadNode *p = FirstNode(T); p != nullptr; p = NextNode(p)) printf("%d ", p->data); }
|
中序线索化二叉树上实现前序遍历的算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void PreOrder(ThreadNode* node) { while(node != nullptr) { printf("%d ", node->data);
if(node->ltag == 0) { node = node->lchild; } else if(node->rtag == 0) { node = node->rchild; } else { while(node!=nullptr && node->rtag==1) node = node->rchild; if(node != nullptr){ node =node->rchild; } } } }
|