二叉樹的幾何結構和遍歷路徑,是查詢前驅和後繼的基礎。
幾何結構千變萬化,但單個結點必然和至多3點鄰接:左(或右)父,左子和右子。按照「x」型助記,交叉點為研究物件。為求結點n的前驅結點p和後繼結點s,設n的左子l,右子r和父f(fl,f的左子,fr,f的右子):若n是f的左子,則f是n的右父;若n是f的右子,則f是n的左父。
同一幾何結構,不同的遍歷方式得到不同的遍歷路徑;具體到單個結點,也就有不同的前驅結點和後繼結點。
先序前驅與後序後繼,先序後繼與後續前驅,和中序前驅與中序後繼,分別形成3對映象過程。
4.1.1 先序前驅
4.1.1.2 若n==fr,且fl==0,則p=f;
4.1.1.3 若n==fr,且fl<>0,則p=fl子樹的末結點(至右至左);
bt* prev (bt* n)
4.1.2 先序後繼
4.1.2.2 若l==0,且r<>0,則s=r;
4.1.2.3 若l==0,且r==0,則s=n的最近右父祖先的fr;
bt* succ (bt* n)
4.2.1 中序前驅
4.2.1.2 若l==0,且n==fr,則p=f;
4.2.1.3 若l==0,且n==fl,則p=n的最近左父祖先;
bt* prev (bt* n)
for (p = n; p->pt && (p->pt->lc == p); p = p->pt);
return p->pt;
}
4.2.2 中序後繼
4.2.1.2 若r==0,且n==fl,則s=f;
4.2.1.3 若r==0,且n==fr,則s=n的最近右父祖先;
bt* succ (bt* n)
for (s = n; s->pt && (s->pt->rc == s); s = s->pt);
return s->pt;
}
4.3.1 後序前驅
4.3.1.2 若r==0,且l<>0,則p=l;
4.3.1.3 若r==0,且l==0,則p=n的最近左父祖先的左子;
bt* prev (bt* n)
4.3.2 後序後繼
4.2.1.2 若n==fl,且fr==0,則s=f;
4.2.1.3 若n==fl,且fr<>0,則s=fr子樹的首結點(至左至右);
bt* succ (bt* n)
二叉樹遍歷的前驅和後繼
下面關於二叉樹三種遍歷方法的前驅和後繼作討論和總結。一 前序遍歷1.1 找後繼 若有左子女,則後繼是左子女 若無左子女,有右子女,則後繼是右子女 若既無左子女,又無右子女,則是一片葉子 若是其父母的左子女,且父母有右子女,則後繼是父母的右子女。若是其父母的左子女,且父母無右子女 若是其父母的右子女。...
線索二叉樹(找前驅 後繼)
建立線索的初衷就是為了在乙個結點中能夠更方便找到前驅結點和後繼結點。中序線索二叉樹 先序線索二叉樹 後序線索二叉樹 找到以p為跟的子樹中,第乙個被中序遍歷的結點 threadnode firstnode threadnode p 在中序線索二叉樹中找到結點p的後繼結點 threadnode next...
找尋二叉搜尋樹的前驅和後繼節點
找尋節點的前驅節點 public node predecessor node node return p 2.節點的左子樹不存在 while node.parent null node node.parent.left return node.parent 找尋節點的後繼節點 public node...