1. 程式人生 > >有一個二叉樹,現在懷疑它有一個結點有2個父節點,請寫出一個函式來判斷該二叉樹是否存在一個節點含有2個父節點。如果存在,返回true,否則返回false。

有一個二叉樹,現在懷疑它有一個結點有2個父節點,請寫出一個函式來判斷該二叉樹是否存在一個節點含有2個父節點。如果存在,返回true,否則返回false。

可以這樣,要檢測一個結點是否有兩個父親時,先把從該結點開始的結點與原樹分離,分成兩部分,然後再從原樹再查詢該結點,如果找到那就是有兩個結點,如果沒有則遞迴查詢。</span>
struct Node{
Node *pLeft;
Node *pRight;
int Data;
};

//pTree為要查詢的樹,pParent為pNode的父結點,pNode為根時pParent 為NULL
//若pTree 中存在具有兩個父結點的點返回真,否則返回假
bool CheckTwoParent( Node *pTree, Node *pParent, Node *pNode)
{
    Node *pTemp = NULL;
    bool result;
    if ( pNode == NULL ) return false;
    if ( pParent == NULL )  //根結點
    {
        if ( pTree->pLeft != NULL )
        {
           pTree->pLeft = NULL;
           result = FindNode( pTree, pNode ); //FindNode為在pTree樹中檢視PNode結點存在與否,若存在返回true,否則返回false,這個很簡單,可以自己寫
           pTree->Left = pNode;
           if ( result ) return true;
        }

        if ( pTree->pRight != NULL )
        {
            pTree->pRight = NULL;
            result = FindNode( pTree, pNode );
            pTree->pRight = pNode;
            if ( result ) return true;
        }

       if ( CheckTwoParent( pTree, pNode, pNode->pLeft) ) return true;
       return CheckTwoParent( pTree, pNode, pNode->pRight);

    }
    else
    {
        if ( pParent->pLeft == pNode )  //若當前結點為左孩子
        {
            pParent->pLeft = NULL;
            result = FindNode( pTree, pNode ); //FindNode為在pTree樹中檢視PNode結點存在與否,若存在返回true,否則返回false,這個很簡單,可以自己寫
            pTree->Left = pNode;
            if ( result ) return true;
        }
        else
        {
            pParent->pRight = NULL;
            result = FindNode( pTree, pNode ); //FindNode為在pTree樹中檢視PNode結點存在與否,若存在返回true,否則返回false,這個很簡單,可以自己寫
            pTree->pRight = pNode;
            if ( result ) return true;
        }

       if ( CheckTwoParent( pTree, pNode, pNode->pLeft) ) return true;
       return CheckTwoParent( pTree, pNode, pNode->pRight);
    }

}