子樹的意思是只要包含了乙個結點,就得包含這個結點下的所有節點.簡單而言,與子樹不同的是,子結構可以是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...