題目:給定一棵二叉樹和其中的乙個節點, 如何找出中序遍歷序列的下乙個節點?樹中的節點除了有兩個分別指向左、右子節點的指標, 還有個指向父節點的指標。
如果乙個節點有右子樹, 那麼它的下乙個節點就是它的右子樹中的最左子節點。也就是說, 從右子節點出發一直沿著指向左子節點的指標, 我們就能找到它的下乙個節點。例如, 圖2.8中節點b的下乙個節點是h, 節點a的下乙個節點是f。
接著我們分析乙個節點沒有右子樹的情形。如果節點是它父節點的左子節點, 那麼它的下乙個節點就是它的父節點。例如, 圖2.8中節點d的下乙個節點是b, 節點f 的下乙個節點是c。
如果乙個節點既沒有右子樹, 並且它還是它父節點的右子節點, 那麼這種情形就比較複雜。我們可以沿著指向父節點的指標一直向上遍歷, 直到找到乙個是它父節點的左子節點的節點。如果這樣的節點存在, 那麼這個節點的父節點就是我們要找的下乙個節點。
為了找到圖2.8中節點1的下乙個節點, 我們沿著指向父節點的指標向上遍歷, 先到達節點e。由千節點e是它父節點b的右節點, 我們繼續向上遍歷到達節點b。節點b是它父節點a的左子節點, 因此節點b的父節點a就是節點1的下乙個節點。
找出節點g的下乙個節點的步驟類似。我們先沿著指向父節點的指標到達節點c。由於節點c是它父節點a的右子節點, 我們繼續向上遍歷到達節點a。由千節點a是樹的根節點, 它沒有父節點, 因此節點g沒有下
乙個節點。
**:
#include struct binarytreenode
;//具體演算法
binarytreenode *getnext(binarytreenode *pnode)
binarytreenode *pnext = nullptr;
if(pnode->m_pright != nullptr)
pnext = pright;
}else if(pnode->m_pparent != nullptr)
pnext = pparent;
}return pnext;
}// ******************** 輔助**用來構建二叉樹 ********************
binarytreenode *createbinarytreenode(int value)
void connecttreenodes(binarytreenode *pparent, binarytreenode *pleft, binarytreenode *pright)
}void printtreenode(binarytreenode *pnode)
else
printf("\n");
}void printtree(binarytreenode *proot)
}void destroytree(binarytreenode *proot)
}// ********************測試**********************
void test(char *testname, binarytreenode *pnode, binarytreenode *expected)
// 8
// 6 10
// 5 7 9 11
void test1_7()
// 5
// 4
// 3
// 2
void test8_11()
// 2
// 3
// 4
// 5
void test12_15()
void test16()
int main(int argc, char *ar**)
二叉樹的下乙個節點
問題 題目給出的預設 為 1 coding utf 8 2 class treelinknode 3 def init self,x 4 self.val x5 self.left none6 self.right none7 self.next none 8class solution 9def ...
二叉樹的下乙個節點
coding utf 8 class treelinknode def init self,x self.val x self.left none self.right none self.next none 1 該節點有左子樹,說明左邊已經遍歷過,該節點作為根節點,下一步應該填右子樹,如果該節點有...
二叉樹的下乙個節點
題目描述 給定一棵二叉樹和其中的乙個節點,如何找出中序遍歷序列的下乙個節點?樹中的節點除了有兩個分別別指向左右子節點的指標,還有乙個指向父節點的指標 例如 這棵樹的中序遍歷是 d,b,h,e,i,a,f,c,g 解題思路 3 當結點的右子樹為空,且是它父節點的左子節點時,它的下乙個節點就是它的父節點...