每日一题之判断一棵二叉树是否是平衡二叉树以及求一颗二叉树的镜像

来源:互联网 发布:java html5 整合 框架 编辑:程序博客网 时间:2024/05/21 12:28

1,检查一棵树是否是平衡二叉树:

首先我们应该了解什么是平衡二叉树?平衡二叉树:它的左右子树的高度差不会超过1,并且左右字树都是一颗平衡二叉树,它的实现方法有AVL,红黑树等等。

首先以递归的方式来实现:

#include<iostream>#include<math.h>using namespace std;struct Node//定义这棵树{int value;Node* left;Node* right;};bool Isbalance(Node* ptreeNode){if (ptreeNode == NULL)return true;int LTreedepth = Depth(ptreeNode->left);int RTreedepth = Depth(ptreeNode->right);int diff = LTreedepth - RTreedepth;if (abs(diff) > 1)return false;return Isbalance(ptreeNode->left) && Isbalance(ptreeNode->right);}//以递归的方式实现int Depth(Node* ptreeNode){if (ptreeNode == NULL)return 0;int LTreedepth = Depth(ptreeNode->left);//这个树的左深度int RTreedepth = Depth(ptreeNode->right);//这个树的右深度return (LTreedepth > RTreedepth) ? (LTreedepth + 1) : (RTreedepth + 1);}
但是如果是以上面的方式实现的话它的时间复杂度是O(n^2),因为首先需要把左右子树遍历一遍,再需要检查是否平衡又要遍历一遍,所以需要遍历两遍,所以我们需要改进:

#include<iostream>#include<math.h>using namespace std;struct Node//定义这棵树{int value;Node* left;Node* right;};bool _Isbalance(Node* ptreeNode, int* depth){if (ptreeNode == NULL){*depth = 0;return true;}int LTreedepth, RTreedepth;bool left = _Isbalance(ptreeNode->left, <reedepth);bool right = _Isbalance(ptreeNode->right, &RTreedepth);if (left&&right){int diff = LTreedepth - RTreedepth;if (abs(diff) < 1){*depth = 1 + (LTreedepth>RTreedepth ? LTreedepth : RTreedepth);return true;}}return false;}bool Isbalance(Node* ptreeNode){int depth = 0;return _Isbalance(ptreeNode, &depth);}
2,求一棵二叉树的镜像

如图所示:

代码实现:

#include<iostream>using namespace std;struct Node//定义这棵树{int value;Node* left;Node* right;};void MirrorReTree(Node* pNode){if (pNode == NULL)return;if (pNode->left == NULL&&pNode->right == NULL)return;Node* tmp = pNode->left;pNode->left = pNode->right;pNode->right = tmp;if (pNode->left)MirrorReTree(pNode->left);if (pNode->right)MirrorReTree(pNode->right);}



阅读全文
0 0
原创粉丝点击