二叉树进阶练习题,附详解,来做题喽~

如果对你有帮助,请一键三连(点赞+收藏+关注)哦~ 感谢支持!欢迎各位在评论区与博主友好讨论!缓慢更新中……


606. 根据二叉树创建字符串

根据示例可得,右边不为空,左边显示和左边不为空,右边为空时,右边不显示。

class Solution {
public:
    void test(TreeNode*root,string& s)
    {
        if(root==nullptr)
            return;
        s+=to_string(root->val);
        if(root->left||root->right)//左空右不空
        {
            s+='(';
            test(root->left,s);
            s+=')';
        }
        if(root->right)
        {
            s+='(';
            test(root->right,s);
            s+=')';
        }
    }

    string tree2str(TreeNode* root) {
//右边不为空,左边显示
//左边不为空,右边为空时,右边不显示
        string s;
        test(root,s);
        return s;
    }
};

102.二叉树的层序遍历 

使用队列,一层层进队列,先进先出。出一个,就入它的子树。

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {

        queue<TreeNode*>q;
        int size=0;
        if(root)
        {
            q.push(root);
            size=1;
        }

        vector<vector<int>>b;
        while(!q.empty())//栈里还有
        {
            vector<int>a;//建立每一层数组
            while(size--)//控制每层输出的数据个数
            {
                TreeNode*f=q.front();
                q.pop();
                a.push_back(f->val);//进入每一层的数组
                if(f->left)
                {
                    q.push(f->left);
                }
                if(f->right)
                {
                    q.push(f->right);
                }
            }
            size=q.size();
            b.push_back(a);

        }
        return b;
    }
};

107.二叉树的层序遍历II

将上题结果逆置即可:reverse(b.begin(),b.end());

二维数组也可逆置!


236. 二叉树的最近公共祖先

会想起 找链表共同节点。路径长的先走,然后从一个节点开始找共同节点。

假设p为6,q为4。

先找到这两个节点,先左后右,入栈:

p先遍历左,直接就找到了:3->5->6

q先遍历左3->5->6
6左右子树都没有,去除63->5
返回5,找5的右树23->5->2
2找左子树73->5->2->7
7左右子树都没有,返回2,删除73->5->2
找2的右子树4,找到了3->5->2->4
返回2,返回5,返回3,递归结束
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool findPath(TreeNode*root,TreeNode*x,stack<TreeNode*>&path)
    {
        if(root==NULL)
            return false;
        path.push(root);//先入栈
        if(root==x)
            return true;
        if(findPath(root->left,x,path))
            return true;
        if(findPath(root->right,x,path))
            return true;
        path.pop();//左右都没有就去除
        return false;

    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*>p1,q1;
        findPath(root,p,p1);
        findPath(root,q,q1);
        while(p1.size()!=q1.size())
        {
            if(p1.size()>q1.size())
                p1.pop();
            else 
                q1.pop();
        }

        while(p1.top()!=q1.top())
        {
            p1.pop();
            q1.pop();
        }
        return q1.top();

    }
};

二叉搜索树与双向链表 

基本逻辑就是cur->left=prev;  prev->right=prev;  遍历完左,prev=cur,遍历右。

 

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    void in(TreeNode*cur,TreeNode*&prev)
    {
        if(cur==nullptr)
            return;
        in(cur->left,prev);
        cur->left=prev;
        if(prev)
            prev->right=cur;
        prev=cur;
        
        in(cur->right,prev);
    }
    
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree==nullptr)
            return nullptr;
        TreeNode*prev=nullptr;
        in(pRootOfTree,prev);
        TreeNode*head=pRootOfTree;
        while(head->left)
        {
            head=head->left;
        }
        return head;
    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1)非递归定义 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除结点外n0 , 其余的每一个结点都有且仅有一个直接前驱结点;有零个或多个直接后继结点。 (2)递归定义 一颗大树分成几个大的分枝,每个大分枝再分成几个小分枝,小分枝再分成更小的分枝,… ,每个分枝也都是一颗树,由此我们可以给出树的递归定义。 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除根结点之外的其他结点分为m(m≥0)个互不相交的集合T0,T1,…,Tm-1,其中每个集合Ti(0≤i<m)本身又是一棵树,称为根的子树(subtree)。 2、掌握树的各种术语: (1) 父母、孩子与兄弟结点 (2) 度 (3) 结点层次、树的高度 (4) 边、路径 (5) 无序树、有序树 (6) 森林 3、二叉树的定义 二叉树(binary tree)是由n(n≥0)个结点组成的有限集合,此集合或者为空,或者由一个根结点加上两棵分别称为左、右子树的,互不相交的二叉树组成。 二叉树可以为空集,因此根可以有空的左子树或者右子树,亦或者左、右子树皆为空。 4、掌握二叉树的五个性质 5、二叉树的二叉链表存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值