代码训练营day14|226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,111.二叉树的最小深度

翻转二叉树

题目
对于根节点,只用将它的左右子节点翻转就行。
其余节点也是,只要依次翻转每个节点的左右节点就行

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;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值