zoukankan      html  css  js  c++  java
  • 二叉树系列

    思路:

    采用队列,将节点进行打印,若该节点具有子节点,则将子节点加入打印序列,直至为空。

    class Solution {
    public:
        vector<int> PrintFromTopToBottom(TreeNode* root) {
            queue<TreeNode*> q; //队列存放每棵树
            q.push(root); //单独push,不能以root初始化
            vector<int> v;//vector存放节点值
            if(root==NULL)
                return v;
            while(!q.empty()){
                root=q.front();//获取第一棵树
                q.pop();//弹出第一棵树,队列先进先出
                v.push_back(root->val);
                if(root->left)
                    q.push(root->left);//队列是push操作
                if(root->right)
                    q.push(root->right);
            }
            return v;
        }
    };

    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
        /*思路:
        已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。
        1、确定root;
        2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
        3、遍历右子树,若发现有小于root的值,则直接返回false;
        4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。*/
            
            if(sequence.size()==0)//分情况考虑,鲁棒性
                return false;
            return judge(sequence,0,sequence.size()-1); // 返回值
        }
        bool judge(vector<int> sequence,int l,int r){
            if(l>=r)       //当后续递归到某个左子树(单节点),返回true
                return true;
            int i;  //作为全局变量,记录右根的起始位置
            for(i=l;i<=r-1;i++){
                if (sequence[i]>sequence[r])
                    break;    //跳出,或者while也行,只需要记录索引
            }
            for(int j=i;j<=r-1;j++)
                if (sequence[j]<sequence[r]) //一旦右子树中出现小于根的值,不满足搜索树定义,返回false
                    return false;
            return judge(sequence,l,i-1)&&judge(sequence,i,r-1); //同时进行比较,返回交的结果
        }
    };

    注意:

    此算法实际上没有实现长度大的数组靠前这一点。

    class Solution {
    public:
        vector<vector<int> > FindPath(TreeNode* root, int expectNumber) {
            vector<vector<int>> path;
            vector<int> current_path;
            //int current_sum = 0;
            if (root)
                dfs(root,expectNumber,path,current_path); //调用时很简单
            return path;
        }
    
        void dfs(TreeNode* root, int expectNumber, vector<vector<int>> &path, vector<int> &current_path){  //定义函数时(类型+地址引用,返回void), 原地址对值进行修改,不用返回值
            current_path.push_back(root->val);
            expectNumber -= root->val; //不采用变量累计sum,而是目标值递减
            if (!root->left&&!root->right&&expectNumber==0){ // 到达叶子节点,进行判断
                path.push_back(current_path); //采用push_back加入满足条件的子路径
            }
            if (root->left)
                dfs(root->left, expectNumber, path, current_path);    //递归递归
            if (root->right)
                dfs(root->right, expectNumber, path, current_path);
            current_path.pop_back();//上述条件不满足则返回父节点
        };
    
    };
  • 相关阅读:
    TypeScript02 方法特性【参数种类、参数个数】、generate方法、析构表达式、箭头表达式、循环
    TypeScript01 编译环境的搭建、字符串特性、类型特性
    Angular04 组件动态地从外部接收值、在组件中使用组件
    Angular03 将数据添加到组件中
    Angular02 通过angular-cli来搭建web前端项目
    Angular01 利用grunt搭建自动web前端开发环境、利用angular-cli搭建web前端项目
    IDEA01 创建java项目、创建web项目
    Struts2框架07 Struts2 + Spring + Mybatis 整合
    素数应用
    二重指针实现排序
  • 原文地址:https://www.cnblogs.com/nicetoseeyou/p/10644025.html
Copyright © 2011-2022 走看看