一棵非空二叉樹中“最左下”結(jié)點(diǎn)定義為:若樹根的左子樹為空,則樹根為“最左下”結(jié)點(diǎn);否則,從樹根的左子樹根出發(fā),沿結(jié)點(diǎn)的左孩子分支向下查找,直到某個(gè)結(jié)點(diǎn)不存在左孩子時(shí)為止,該結(jié)點(diǎn)即為此二叉樹的“最左下”結(jié)點(diǎn)。例如:下圖所示的以A為根的二叉樹的“最左下”結(jié)點(diǎn)為D,以C為根的子二叉樹中的“最左下”結(jié)點(diǎn)為C。二叉樹的結(jié)點(diǎn)類型定義如下:
typedef struct BSTNode {
int data ;
struct BSTNode *lch , *rch; //結(jié)點(diǎn)的左、右孩子指針
} *BSTree;
函數(shù)BSTree Find_Del (BSTree root )的功能是:若root指向一棵二茶樹的根結(jié)點(diǎn),則找出該結(jié)點(diǎn)的右子樹上的“最左下”結(jié)點(diǎn) *p,并從樹中刪除以 *p為根的子樹,函數(shù)返回被刪除子樹的根結(jié)點(diǎn)指針;若該樹根的右子樹上不存在“最左下”結(jié)點(diǎn),則返回空指針。
【函數(shù)】
BSTree Find_Del (BSTree root)
{ BSTree p, pre;
If ( !root ) return NULL; /* root 指向的二叉樹為空樹 */
___(1)___ ; /* 令p指向根結(jié)點(diǎn)的右子樹 */
if ( !p ) return NULL;
___(2)___ ; /* 設(shè)置 pre 的初值 */
while ( p -> lch ) { /* 查找“最左下”結(jié)點(diǎn) */
pre = p ; p = __(3)__ ;
}
if ( __(4)__ = = root ) /* root的右子樹根為“最左下”結(jié)點(diǎn)*/
pre -> rch =NULL;
else
__(5)__ = NULL; /* 刪除以“最左下”結(jié)點(diǎn)為根的子樹*/
return p;
}