美文网首页程序猿阵线联盟-汇总各类技术干货程序员
二叉树算法积累(二叉树镜像/子树判断)

二叉树算法积累(二叉树镜像/子树判断)

作者: 沧州宁少 | 来源:发表于2017-11-29 16:03 被阅读0次

    二叉树算法积累

    存在二叉树A.B判断二叉树B是否是A的子树。

    • 注意问题边界条件的控制。
    • A为空直接返回False.B为空A不为空直接返回true
    • 先查找A中和B的根节点值相同的节点。
    • 存在则继续递归A中当前节点的左右节点。

    废话不多说,直接上代码。如果有错误请指出~ 谢谢

     struct BinaryTreeNode {
    
       double m_dbValue;
       BinaryTreeNode*m_leftNode;
       BinaryTreeNode*m_rightNode;
    };
    
     bool isEqual(double number1,double number2)
     {
    //    return (abs(number1 - number2)<0.000001);
      if ((number1-number2>= - 0.0000001)&&(number1-  number2)<0.0000001) {
          return true;
       }else{
          return false;
    }
    }
    
     bool matchSubTree(BinaryTreeNode*pRootA,BinaryTreeNode*pRootB){
    
       if (pRootA == nullptr) {
          return false;
        }
       if (pRootB == nullptr) {
           return true;
        }
       if (!(isEqual(pRootA->m_dbValue, pRootB->m_dbValue))) {
          return false;
        }
     return matchSubTree(pRootA->m_leftNode, pRootB->m_leftNode)&&matchSubTree(pRootA->m_rightNode, pRootB->m_rightNode);
    }
    
    
      // 判断B树是否是A树的子树
     bool subTree(BinaryTreeNode*pNodeA,BinaryTreeNode*pNodeB){
    
         bool result = false;
         if (pNodeA != nullptr&&pNodeB != nullptr) {
        
        //如果根节点相同。则继续遍历左右节点
        if (pNodeA->m_dbValue == pNodeB->m_dbValue) {
            result = matchSubTree(pNodeA, pNodeB);
        }
        // 如果根节点不同,则继续查找
        if (!result) {
            result = subTree(pNodeA->m_leftNode, pNodeB);
        }
        if (!result) {
            result = subTree(pNodeA->m_rightNode, pNodeB);
        }
    }
    return result;
    }
    

    完成一个函数,输入一棵二叉树,输出它的镜像

    • 画图分析可知。所有节点的左右节点交换。主要依靠递归。思路比较简单
         // 求一棵二叉树的镜像
        void exchangeTree(BinaryTreeNode*rootNode){
    
        if (rootNode == nullptr) {
          return;
        }
        if (rootNode->m_leftNode != nullptr && rootNode->m_rightNode != nullptr) {
        
        BinaryTreeNode*node = rootNode->m_leftNode;
        rootNode->m_leftNode = rootNode->m_rightNode;
        rootNode->m_rightNode = node;
        }
        exchangeTree(rootNode->m_leftNode);
        exchangeTree(rootNode->m_rightNode);
        }
    

    相关文章

      网友评论

        本文标题:二叉树算法积累(二叉树镜像/子树判断)

        本文链接:https://www.haomeiwen.com/subject/enxpbxtx.html