整理自用 二叉樹的子樹 子結構

2021-08-18 18:54:01 字數 2154 閱讀 4776

子樹的意思是只要包含了乙個結點,就得包含這個結點下的所有節點.

子結構的意思是包含了乙個結點,可以只取左子樹或者右子樹,或者都不取。

簡單而言,與子樹不同的是,子結構可以是a樹的任意一部分

這裡以一顆7節點,高度為3的滿二叉樹為例,說明子樹和子結構的差別:

圖1對於圖1而言,子樹意味著圖2,圖3等情況。根據定義非常好理解。

圖2 圖1子樹的某一種情況

圖3 圖1子樹的某一種情況

由於子結構可以是原樹的任意乙個部分,因此圖3就是乙個子結構。

圖4 圖1的子結構示意圖

//函式宣告,這裡是為了先看首先要呼叫的函式,才放到後面去的。

bool issubtree(treenode* proot1, treenode* proot2);

//正式開始第乙個函式

bool hassubtree(treenode* proot1, treenode* proot2)

//如果不同或者是以當前節點為根節點下找不到相同的子樹,那麼就看看a樹的左節點或者右節點中有沒有。

if(!result)

result = hassubtree(proot1->left, proot2);

if(!result)

result = hassubtree(proot1->right, proot2);

return result;

}bool issubtree(treenode* proot1, treenode* proot2)

return issubtree(proot1->left, proot2->left) && issubtree(proot1->right, proot2->right);

}else

return

false;

}

根據定義,可以知道子樹是子結構中的一種特殊情況,因此兩段**之間有很大的相似之處。

不同之處在於:

1. 子樹只要包含了乙個結點,就得包含這個結點下的所有節點。因此,a樹與其子樹一定最後同時訪問到空指標。

2. 子結構只要包含任意相連的任意數量的結點即可。

因此,對於子結構而言,只要在子結構訪問到空指標之前,所有的節點均和a樹的某部分相同就可以了。

//函式宣告,這裡是為了先看首先要呼叫的函式,才放到後面去的。

bool issubtree(treenode* proot1, treenode* proot2);

//正式開始第乙個函式

bool hassubtree(treenode* proot1, treenode* proot2)

//如果不同或者是以當前節點為根節點下找不到相同的子樹,那麼就看看a樹的左節點或者右節點中有沒有。

if(!result)

result = hassubtree(proot1->left, proot2);

if(!result)

result = hassubtree(proot1->right, proot2);

return result;

}bool issubtree(treenode* proot1, treenode* proot2)

return issubtree(proot1->left, proot2->left) && issubtree(proot1->right, proot2->right);

}else

return

false;

}

二叉樹的子樹和子結構

子樹 是只要包含了乙個結點,就得包含這個結點下的所有節點。子結構 包含了乙個結點,可以只取左子樹或者右子樹,或者都不取。判斷乙個二叉樹是不是另乙個二叉樹子樹的 實現如下 class solution private bool issubtree treenode r1,treenode r2 ret...

二叉樹的子樹和子結構

子樹的意思是包含了乙個結點,就得包含這個結點下的所有節點,一棵大小為n的二叉樹有n個子樹,就是分別以每個結點為根的子樹。子結構的意思是包含了乙個結點,可以只取左子樹或者右子樹,或者都不取。直接上 這解釋起來也蛋疼。class solution public bool issubtree treeno...

二叉樹的子樹和子結構

子樹的意思是包含了乙個結點,就得包含這個結點下的所有節點,一棵大小為n的二叉樹有n個子樹,就是分別以每個結點為根的子樹。子結構的意思是包含了乙個結點,可以只取左子樹或者右子樹,或者都不取。直接上 這解釋起來也蛋疼。class solution public bool issubtree treeno...