有一個二叉樹,現在懷疑它有一個結點有2個父節點,請寫出一個函式來判斷該二叉樹是否存在一個節點含有2個父節點。如果存在,返回true,否則返回false。
阿新 • • 發佈:2018-12-29
可以這樣,要檢測一個結點是否有兩個父親時,先把從該結點開始的結點與原樹分離,分成兩部分,然後再從原樹再查詢該結點,如果找到那就是有兩個結點,如果沒有則遞迴查詢。</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); } }