二叉树

2020-08-05  本文已影响0人  魔芋辣椒

二叉树

二叉搜索树与双向链表

「栈实现中序遍历」

 Node* treeToDoublyList(Node* root) {
     if(root==NULL)return NULL;
     stack<Node*>s;
      Node*head=root,*pre=NULL;
     while(root||!s.empty()){
        if(root){
            s.push(root);
            root=root->left;
        }else{
            root=s.top();
            s.pop();
            if(pre==NULL){
                head=root;
            }else{
                pre->right=root;
                root->left=pre;

            }
            pre=root;
            root=root->right;
        }
     }
     pre->right=head;
     head->left=pre;
     return head;
    }

树的子结构

判断B是不是A的子结构

bool helper(TreeNode* A, TreeNode* B) {
        if (A == NULL || B == NULL) {
            return B == NULL ? true : false;
        }
        if (A->val != B->val) {
            return false;
        }
        return helper(A->left, B->left) && helper(A->right, B->right);
    }

    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if (A == NULL || B == NULL) {
            return false;
        }
        return helper(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B);
    }

二叉树的最近公共祖先

后序遍历子树,找到p,q

1 p, q 分别位于 x 的左子树和右子树;return root;
2 p, q 都在 x 的左子树. return left
3 p, q 都在 x 的右子树 return right

 TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL)return NULL;
        if(root->val==p->val||root->val==q->val)
            return root;
        TreeNode* left=lowestCommonAncestor( root->left,  p,  q);
        TreeNode* right=lowestCommonAncestor( root->right,  p,  q);
        if(left&&right)return root;
        else if(left) return left;
        else if(right) return right;
        return NULL;
    }

1122344

上一篇下一篇

猜你喜欢

热点阅读