以下是深度优先搜索的伪代码:
class Solution {
public:
bool visited[MAX_VERTEX_NUM];//设置该数组防止重复访问
void DFSTraverse(Grapg G){
//外层封装,也可以拆开不用
for(v=0;v<G.vexnum;v++)
visited[v]=false;//标记为没有访问
for(v=0;v<G.vexnum;v++)
if(!visited [v])
DFS(G,v);
}
void DFS(Grapg G, int v){
visit(v);
visited[v]=true;//访问并标记当前节点,对于二叉树结构可以不用这个标记
for(w=neighbour(G,v);w>0;w=nextneighbour){
//遍历每个邻居,递归进行访问
//使用递归的算法形式,重点在于列出贝尔曼方程
if(!visited[w])
DFS(G,w);
}
}
}
//树本身是根递归定义的,每个子结点(包括叶子结点)都可以看做是一棵子树的根
//因此根遍历一定是可以遍历到每个结点代表的迷你子树的,这也决定了递归遍历的形式简单性
//由于树的递归性质,很多问题可以采取减治法解决,将问题范围缩小为左子树和右子树
点击题目标题可以转到相应页面
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(p==nullptr&&q==nullptr)
return true;
else if(p==nullptr||q==nullptr)
return false;
else if(p->val!=q->val)//前三个条件判断是访问当前结点,后一个则是深度搜索遍历
return false;
else return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
//else return isSameTree(p->left, q->right) && isSameTree(p->right, q->left);
//将左右指针交换后可以检查两棵树是否成镜像
}
};
226. 翻转二叉树
解析:一样的遍历方式,不过这次的访问形式为交换结点
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root!=nullptr) {
//交换结点,无论是否为空都可以
TreeNode* tmp = root->right;
root->right = root->left;
root->left = tmp;
inv