二叉树做题:1339:求后序遍历;1340:扩展二叉树;110. 平衡二叉树;

 1340:扩展二叉树

#include
using namespace std;
struct node{
	char ch;
	node *lchild;
	node *rchild;
};
string s;
int i=-1;
node *build(){
	i++;
	node *rt=new node;
	if(s[i]!='.'){
		rt->ch=s[i];
		rt->lchild=build();
		rt->rchild=build();
	}else return NULL;
	return rt;
} 
void printInorder(node *rt){
	if(rt==NULL) return;
	else{
		printInorder(rt->lchild);
		cout<ch;
		printInorder(rt->rchild);
	}
}
void printPostOrder(node *rt){
	if(rt==NULL) return;
	else{
		printPostOrder(rt->lchild);
		printPostOrder(rt->rchild);
		cout<ch;
	}
}
int main(){
	cin>>s;
	node* root=build();
	node *tmp=root;
	printInorder(tmp);
	cout<

1339:求后序遍历

#include
using namespace std;
string pre,in; 
void getAns(int l1,int r1,int l2,int r2){
	if(l1>r1||l2>r2) return;
	int t=l2;
	while(pre[l1]!=in[t]) t++;
	getAns(l1+1,r1+t-l2,l2,t-1);//左子树 
	getAns(l1+1+t-l2,r1,t+1,r2);//右子树 
	cout<>pre>>in;
	getAns(0,pre.size()-1,0,in.size()-1);
	return 0;
}

110. 平衡二叉树

注意:

并不是树根的左右子树高度相差<=1就好了,如图所示。一定是要每一个结点的左右子树高度相差<=1。

二叉树做题:1339:求后序遍历;1340:扩展二叉树;110. 平衡二叉树;_第1张图片

代码一:cv题解。

对每个结点进行判断(递归求左右子树的高度,看看它的左右子树高度是否相差在1以内),并对当前节点的左右子节点进行判断(判断左右子节点各自的子树高度差是否在1以内)。 

class Solution {
public:
    int height(TreeNode* root) {
        if (root == NULL) {
            return 0;
        } else {
            return max(height(root->left), height(root->right)) + 1;
        }
    }

    bool isBalanced(TreeNode* root) {
        if (root == NULL) {
            return true;
        } else {//对当前结点进行判断,并对当前节点的左右子节点进行判断。
            return abs(height(root->left) - height(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right);
        }
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/balanced-binary-tree/solution/ping-heng-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码二:

思路:

因为是要对每个点进行判断,自顶向下会重复判断,所以我们自底向上,自底向上就是后序序列的遍历方式。对每个点,如果它的左右子树的高度差<=1,则返回该点的层数;否则返回-1.

class Solution {
public:
    int getAns(TreeNode *root){
        if(root==NULL) return 0;
        int left=getAns(root->left);
        int right=getAns(root->right);
        if(left==-1||right==-1||abs(left-right)>1) return -1;
        return max(left,right)+1;
    }
    bool isBalanced(TreeNode* root) {
        //思路就是对每一个结点求它的左右子树的高度差
        return getAns(root)>=0;
    }
};

 

 

 

 

你可能感兴趣的:(ACM算法)