11月29日 剑指offer 平衡二叉树 && Leetcode

题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。

解析:

首先得明白平衡二叉树的定义,就是左右子树高度差的绝对值不超过1。

所以用递归可以解决,对二叉树进行左右遍历,然后得到左右子树的高度,判断绝对值的值是否大于1,然后一个节点的高度取决于return max(left_depth, right_depth);

代码:

int tryTree(TreeNode* curNode, int depth, bool &flag)
{
	if (flag) return -1;
	if (curNode == nullptr)  return 0;
	int left_depth = tryTree(curNode->left, depth, flag) + 1;
	int right_depth = tryTree(curNode->right, depth, flag) + 1;
	if (abs(left_depth - right_depth)>1)  flag = true;
	//cout << max(left_depth, right_depth) << endl;
	return max(left_depth, right_depth);
}

bool IsBalanced_Solution(TreeNode* pRoot)
{
	if (pRoot == nullptr)  return true;
	TreeNode* treeRoot = pRoot;
	bool flag = false;
	tryTree(treeRoot, 0, flag);
	return !flag;
}

int main()
{
	TreeNode* p1 = new TreeNode(1); 
	TreeNode* p2 = new TreeNode(2);
	TreeNode* p3 = new TreeNode(3);
	TreeNode* p4 = new TreeNode(4);
	TreeNode* p5 = new TreeNode(5);
	TreeNode* p6 = new TreeNode(6);
	p1->left = p2;
	p1->right = p3;
	p2->left = p4;
	p2->right = p5;
	p5->left = p6;
	p3->left = p3->right = nullptr;
	p4->left = p4->right = nullptr;
	p5->right = nullptr;
	
	IsBalanced_Solution(p1);
	
	return 0;
}           
  1. Longest Valid Parentheses
    Hard

Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.

Example 1:

Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”

Example 2:

Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”

解析: 求最长的合法括号长度。我们分析下,就会知道,只有在出现“)”时,才会出现最长合法括号长度。
所以当为“(”入栈它的序号(例如为5),当遇到第一个“)”(序号为6)时,就进行更新,找到最近的一组括号匹配,然后以6结尾的的最大合法长度为 2+ dp[4](以4结尾的最大合法长度)。

代码:

class Solution 
{
public:
    int longestValidParentheses(string s) 
    {
        if(s.length()==0) return 0;
    	vector<int>dp(s.length(),0);
    	int max_length = -1;
    	stack<int>st;
    	for(int i=0;i<s.length();i++)
    	{
    		if(s[i]=='(')  st.push(i);
    		else 
    		{
    			if(!st.empty())
    			{
    				int top  = st.top();
    				st.pop();
    				dp[i] = i - top + 1;
    				dp[i] += dp[top-1];
    				if(dp[i]>max_length)  max_length = dp[i];
    			}
    		}
    	}
    	return max(max_length,0);
    }
};
    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/u014303647/article/details/84728146
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞