翻转二叉树
题目
对于根节点,只用将它的左右子节点翻转就行。
其余节点也是,只要依次翻转每个节点的左右节点就行
Node* exchange(Node* root){//1.确定递归参数和返回值
if(root==NULL) return;//2.确定终止条件
swap(root->left,root->right);
exchange(root->left);
exchange(root->right);
}
如果先处理根节点的左右节点,则是前序遍历。
将swap放到最后,则是最后处理根节点,为后序遍历。
但不能是中序遍历,不然处理会有重复。
也可以用迭代来完成。
Node* exchange(Node*root){
stack<Node*> z;
if(root!=NULL) z.push(root);
Node* cur=root;
while(!z.empty()){
cur=z.top();
z.pop();
swap(cur->left,cur->right);
if(cur->right!=NULL) z.push(cur->right);
if(cur->left!=NULL) z.push(cur->left);
}
}
对称二叉树
先说相同二叉树该怎么比较。
1.确定传入参数,函数返回值。
bool issame(Node*left,Node*right){
}
2.确定终止条件。
如果left和right都相等且为空时,return true;
有一个为空一个不空是false;
如果两个值都相等,则应该再比较他们的left和left,right和right;
bool issame(Node*left,Node*right){
if(left==NULL&&right==NULL) return true;
else if((left!=NULL&&right==NULL)||(left==NULL&&right!=NULL))
return false;
else if(left->val!=right->val) return false;
return issame(left->left,right->left)&&issame(left->right&&right->right);
}
对称二叉树唯一的改动只不过是将左侧与左侧的比较改为left->left和right->right的比较,也就是分别比较内侧和外侧。
二叉树的最大深度。
确定一个可以求最大深度的函数
int getdepth(TreeNode* root){
//确定类型与参数
}
可以将树拆分为根节点和左右子树。
用这个函数得到左右子树的最大深度,只用在他们中最大的那个上加1就是整个树的深度。
int getdepth(TreeNode* root){
if(root==NULL) return 0;
int ld=getdepth(root->left);
int rd=getdepth(root->right);
int max=ld>rd?ld:rd;
return max+1;
}
二叉树的最小深度
整体代码改动不大,但要注意不能直接写成
int min=ld>rd?rd:ld;
因为如果有一边深度为0,另一边还有的话,并不是结束位置,结束位置应该是左右深度都为0的时候。
int min=ld>rd?rd:ld;
if(ld==0&&rd!=0) min=rd;
else if(ld!=0&&rd=0) min=ld;