Skip to content

Latest commit

 

History

History
423 lines (351 loc) · 11 KB

BinaryTree.md

File metadata and controls

423 lines (351 loc) · 11 KB


  • 二叉树前序中序非递归序列

    vector<int> inorderTraversal(TreeNode* root) {
        if(root==NULL)
    	return {};
        TreeNode *p=root;
        stack<TreeNode*> s;
        while(p!=NULL||!s.empty())
    	while(p!=NULL)
    	    s.push(p);p=p->left;
    	if(!s.empty())
    	    p=s.top();
    	    res.push_back(p->val);
    	    s.pop();p=p->right;
    return res;
    
  • 二叉树后续遍历序列

    void postOrderTraversalNew(TreeNode *root,path)
    	stack< pair<TreeNode *, bool> > s;
    	s.push(make_pair(root, false));
    	    bool visited;
    	    while(!s.empty())
    		root = s.top().first;
    		visited = s.top().second;s.pop();
    		if(root == NULL)
    		    continue;
    		if(visited)
    		    path.push_back(root->val);
    		else
    		    s.push(make_pair(root, true));
    		    s.push(make_pair(root->right, false));
    		    s.push(make_pair(root->left, false));
    
  • 验证二叉搜索树

      bool isValidBST(TreeNode* root)
          if(root==NULL)
      	return true;
          return isValidBST(root,NULL,NULL);
      bool isValidBST(TreeNode *root,TreeNode*min,TreeNode*max)
          if(root==NULL)
      	return true;
          if(min!=NULL&&root->val<=min->val)
      	return false;
          if(max!=NULL&&root->val>=max->val)
      	return false;
      return isValidBST(root->left,min,root)&&isValidBST(root->right,root,max);
    
  • 二叉搜索树是否是对称的

    bool isSymmetric(TreeNode* root) {
        if(root==NULL)
    	return  true;
        return isSymmetric(root->left,root->right);
    bool isSymmetric(TreeNode*&left,TreeNode*&right) const{
        if(left==NULL&&right==NULL)
    	return true;
        if(left==NULL||right==NULL)
    	return false;
    return left->val==right->val&&isSymmetric(left->left,right->right)&&isSymmetric(left->right,right->left);
    
  • 二叉树层序遍历

    vector<vector<int>> levelOrder(TreeNode* root)
        if(root==NULL)
    	return {};
        queue<TreeNode*> q; q.push(root); int level=0;
        while(!q.empty())
    	int size=q.size();
    	res.push_back({});
    	for(int i=0;i<size;i++)
    	    TreeNode*temp=q.front(); q.pop();
    	    res[level].push_back(temp->val);
    	    if(temp->left)
    		q.push(temp->left);
    	    if(temp->right)
    		q.push(temp->right);
    	level++;
    
  • 二叉树最大深度

    int maxDepth(TreeNode* root)
        if(root==NULL)
    	return 0;
        int left=maxDepth(root->left);
        int right=maxDepth(root->right);
    return max(left,right)+1;
    
  • 前序中序构造二叉树

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
        return buildTree(preorder,0,preorder.size(),inorder,0,inorder.size());
    TreeNode*buildTree(vector<int>& pre,int pre_start,int pre_end, vector<int>& in_,int in_start,int in_end)
        if(pre_start>=pre_end||in_start>=in_end)
    	return NULL;
        TreeNode *root=new TreeNode(pre[pre_start]);
        for(int i=in_start;i<in_end;i++)
    	if(in_[i]==pre[pre_start])
    	    root->left=buildTree(pre,pre_start+1,pre_start+i-in_start+1,in_,in_start,i);
    	    root->right=buildTree(pre,pre_start+i-in_start+1,pre_end,in_,i+1,in_end);
    return root;
    
  • 二叉树最大路径和

    int maxPathSum(TreeNode* root)
        if(root==NULL)
    	return 0;
        compute(root);
        return res;
    int compute(TreeNode *root)
        if(root==NULL)
    	return 0;
        int left=max(compute(root->left),0);
        int right=max(compute(root->right),0);
        res=max(res,root->val+left+right);
    return max(left,right)+root->val;
    
  • 完全二叉树结点个数

    int countNodes(TreeNode* root) 
        if(root==NULL)
    	return 0;
        int l=0,r=0;
        TreeNode*left=root,*right=root;
        while(left)//求左右树高度
    	left=left->left; l++;
        if(l==r)
    	return pow(2,l)-1;
        else
    	return 1+countNodes(root->left)+countNodes(root->right);
    
  • 二叉树第K小的结点

    int kthSmallest(TreeNode* root, int k) {
        if(root==nullptr)
    	return 0;
        int val1=kthSmallest(root->left,k);
        if(index==k)
    	return val1;
        index++;
        if(index==k)
    	return root->val;
        int val2=kthSmallest(root->right,k);
        if(index==k)
    	return val2;
    return 0;
    
  • 最近公共祖先

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)
    	return root;
        dfs(root,p,q);
        return ans;
    bool dfs(tn*root, tn*p,tn*q)
        if(root==NULL)
    	return false;
        bool left=dfs(root->left,p,q);
        bool right=dfs(root->right,p,q);
        if((left&&right)||((left||right)&&(p->val==root->val||q->val==root->val)))
    	ans=root;
    	return true;
    return left||right||root->val==p->val||root->val==q->val;
    
  • 序列化与反序列化

    string rserialize(TreeNode* root){
    	if(root==NULL)
    	    return "#";
    str=to_string(root->val)+","+rserialize(root->left)+","+rserialize(root->right);
    	return str;
    string serialize(TreeNode* root) 
        string str=rserialize(root);return str;
    TreeNode* rdeserialize(string &data,int& start) {
        if(data.empty()||data[start]=='#')
    	start+=2;
    	return NULL;
        int num=0;int i;int sign=1;
        if(data[start]=='-')
    	sign=-1;start++;
        for(i=start;i<data.size();i++)
    	if(isdigit(data[i]))
    	    num=num*10+(data[i]-'0');
    	else
    	    break;
        start=i+1;
        TreeNode *root=new TreeNode(sign*num);
        if(start<data.size())
    	root->left=rdeserialize(data,start);
    	root->right=rdeserialize(data,start);
        return root;
    TreeNode* deserialize(string data)
        int start=0;
    return rdeserialize(data,start);
    
  • 路径和为K:不从根节点开始

    int pathSum(TreeNode* root, int sum)
        if(root==NULL)
    	return 0;
        dfs(root,sum,0);
        pathSum(root->left,sum);
        pathSum(root->right,sum);
        return res;
    void dfs(TreeNode*root,int sum,int cur)
        if(root==NULL)
    	return;
        cur+=root->val;
        if(cur==sum)
    	res++;
        dfs(root->left,sum,cur);
    dfs(root->right,sum,cur);
    
  • 树中重复的子树

    vector<TreeNode*> findDuplicateSubtrees(TreeNode* root)
        dfs(root);
        return res;
    string dfs(TreeNode*root)
        if(root==NULL)
    	return "";
        string str=to_string(root->val)+","+dfs(root->left)+","+dfs(root->right);
        if(memo[str]==1)
    	res.push_back(root);
        memo[str]++;
    return str;
    
  • 二叉树最大宽度:包括null结点

    int widthOfBinaryTree(TreeNode* root)
        if (!root) return 0;
        queue<pair<TreeNode*, unsigned long long>> q;
        int ans = 1;
        q.push({root, 1});
        while (!q.empty()) 
    	int sz = q.size();
    	ans = max(int(q.back().second - q.front().second + 1), ans);
    	for (int i=0; i < sz; i++) 
    	    TreeNode *node = q.front().first;
    	    unsigned long long pos = q.front().second;
    	    q.pop();
    	    if (node->left) q.push({node->left, 2 * pos});
    	    if (node->right) q.push({node->right, 2 * pos + 1});
    return ans;
    
  • 最长同数值路径

    int longestUnivaluePath(TreeNode* root)
        helper(root);
        return ans;
    int helper(TreeNode *root)
        if(root==NULL)
    	return 0;
        int maxLeft=helper(root->left);
        int maxRight=helper(root->right);
    if(r->left&root->right&root->val=root->left->val&root->val=root->right->val)
    	ans=max(ans,maxLeft+maxRight+2);
        int maxLength=0;
        if(root->left&&root->left->val==root->val)
    	maxLength=maxLeft+1;
        if(root->right&&root->right->val==root->val)
    	maxLength=max(maxLength,maxRight+1);
        ans=max(ans,maxLength);
    return maxLength;
    
  • 判断两棵树是否是镜像

    bool flipEquiv(TreeNode* root1, TreeNode* root2) {
        if(root1==NULL&&root2==NULL)
    	return true;
        if(root1==NULL||root2==NULL||root1->val!=root2->val)
    	return false;
        return flipEquiv(root1->left,root2->right)&&flipEquiv(root1->right,root2->left)||
       flipEquiv(root1->right,root2->right)&&flipEquiv(root1->left,root2->left);
    
  • 先序构造二叉树

    TreeNode* bstFromPreorder(vector<int>& preorder)
        if(preorder.empty())
    	return nullptr;
        return bstFromPreorder(preorder,0,preorder.size()-1);
    TreeNode* bstFromPreorder(vector<int>&preorder,int left, int right)
        if(left>right)
    	return nullptr;
        TreeNode*root=new TreeNode(preorder[left]);
        if(left==right)
    	return root;
        int start=left+1;
        while(start<=right&&preorder[start]<preorder[left]){
    	start++;
        root->left=bstFromPreorder(preorder,left+1,start-1);
        root->right=bstFromPreorder(preorder,start,right);
    return root;
    
  • 二叉树结点与祖先之间最大差值

    int maxAncestorDiff(TreeNode* root)
        if(root==NULL)
    	return 0;
        dfs(root,root->val,root->val);
        return res;
    void dfs(TreeNode*root, int min_val, int max_val)
        if(root==NULL)
    	return;
        res=max(max(abs(root->val-min_val),abs(root->val-max_val)),res);
        min_val=min(min_val,root->val);
        max_val=max(max_val,root->val);
        dfs(root->left,min_val,max_val);
    dfs(root->right,min_val,max_val);
    
  • 祖父节点为偶数的值

    int sumEvenGrandparent(TreeNode* root)
        if(root==NULL)
    	return 0;
        dfs(1,1,root);
        return res;
    void dfs(int grand_val,int father_val, TreeNode*node)
        if(node==NULL)
    	return;
        if(grand_val%2==0)
    	res+=node->val;
        dfs(father_val,node->val,node->left);
    dfs(father_val,node->val,node->right);
    
  • 树中任意两个结点之间的距离

    int countPairs(TreeNode* root, int distance)
        dfs(root,distance);
        return res;
    vector<int> dfs(TreeNode*root, int distance)
        if(root==NULL)
    	return {};
        if(root->left==NULL&&root->right==NULL)
    	return {0};
        vector<int> ret;
        vector<int> left=dfs(root->left,distance);
        for(int &d:left)
    	if(++d>distance)
    	    continue;
    	ret.push_back(d);
        vector<int> right=dfs(root->right,distance);
        for(int &d:right)
    	if(++d>distance)
    	    continue;
    	ret.push_back(d);
        for(int l:left)
    	for(int r:right)
    	    if(l+r<=distance)
    		res+=(l+r<=distance);
    return ret;
    
  • 二叉树转链表

    TreeNode* convertBiNode(TreeNode* root)
        if(root==NULL)
    	return NULL;
        trans(root);
        while(root->left)
    	root=root->left;
        return root;
    TreeNode* trans(TreeNode*root){
        if(root==NULL)
    	return NULL;
        TreeNode* left=trans(root->left);
        if(left!=NULL)
    	left->right=root;
    TreeNode* right=trans(root->right);
    
  • 二叉树转链表

      class Solution
          Node *head;
          Node* treeToDoublyList(Node* root)
      	if(root==NULL) return NULL;
      	Node *pre=NULL;
      	treeToDoublyList(root,pre);
      	head->left=pre;
      	pre->right=head;
      	return head;
          void treeToDoublyList(Node* root,Node*&pre)
      	if(root==NULL) return;
      	treeToDoublyList(root->left,pre);
      	root->left=pre;
      	if(pre!=NULL)
      	    pre->right=root;
      	else
      	    head=root;
      	pre=root;
      	treeToDoublyList(root->right,pre);