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