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

二叉树算法积累

存在二叉树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);
    }

你可能感兴趣的:(二叉树算法积累(二叉树镜像/子树判断))