首页 > 试题广场 >

两颗二叉树T1和T2,T1的节点数是百万数量级,T2的节点数

[问答题]
两颗二叉树T1和T2,T1的节点数是百万数量级,T2的节点数一千以内,请给出判断T2是否是T1子树的可行算法。
提供一个牛客左老师的思路:
1、先把两颗树转换成某种遍历序列,注意,空子树部分要有记号。
2、查找两个序列中,长的序列是否包含短的序列,相当于最长仅共子序列查找问题。
编辑于 2015-08-22 17:03:44 回复(0)
bool IsSubtree(BinaryTreeNode* pRoot1, BinaryTreeNode* pRoot2) {
     if (pRoot1 == NULL || pRoot2 == NULL) {
        return false;  
     }  
     stack<BinaryTreeNode*> stk;  
     stk.push(pRoot1);  
     while (!stk.empty()) {
         BinaryTreeNode *tmp = stk.top();
         stk.pop();  
         if (tmp->m_nValue == pRoot2->m_nValue) {  
             stack<BinaryTreeNode*> first;  
             BinaryTreeNode *f;  
             stack<BinaryTreeNode*> second;
             BinaryTreeNode *s;  
             first.push(tmp);  
             second.push(pRoot2);  
             bool find = true;
             while (!first.empty()) {  
                 f = first.top();  
                 first.pop();  
                 s = second.top();  
                 second.pop();  
                 if (f->m_nValue != s->m_nValue) {  
                     find = false;  
                     break;  
                 }  
                 if (s->m_pLeft != NULL) {
                      if (f->m_pLeft == NULL) {
                         find = false;  
                         break;
                      } else {
                         first.push(f->m_pLeft);
                         second.push(s->m_pLeft);  
                     }
                 }  
                 if (s->m_pRight != NULL) {
                     if (f->m_pRight == NULL) {
                         find = false;  
                         break;
                     } else {
                         first.push(f->m_pRight);
                         second.push(s->m_pRight);  
                     }
                  }  
             }  
             if (find == true && first.empty()) {  
                 return true;  
             }  
         }  
         if (tmp->m_pLeft != NULL) {  
             stk.push(tmp->m_pLeft);  
         }

         if (tmp->m_pRight != NULL) {
             stk.push(tmp->m_pRight);  
         }  
     }
    return false;  
 }  

编辑于 2015-07-04 21:49:48 回复(0)