zoukankan      html  css  js  c++  java
  • leetcode : Binary Tree Paths

    Given a binary tree, return all root-to-leaf paths.

    For example, given the following binary tree:

       1
     /   
    2     3
     
      5
    

    All root-to-leaf paths are:

    ["1->2->5", "1->3"]

    思路:用两个stack<TreeNode*> in , s;

    in : 记录当前的路径 p  , 和vector<int>path 相同,只不过一个记录的是 val ,一个记录点的指针。

    s  : 记录每个节点的  p->right 

    v2s : 将path转换称符合要求的string

    /**
     * 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:string v2s(vector<int>a){
        const int len = a.size();
        string re = "";
        char *p = new char[500];
        for (int i = 0; i<len; i++){
            stringstream ss;    // 需要包含头文件  #include<sstream>
            string temp;
            ss << a[i];
            ss >> temp;
            re = re + temp;
            if (i != len - 1)
                re = re + "->";
        }
        return re;
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> path;
        vector<string> re;
        if (root == NULL) return re;
        TreeNode * p = root;
        stack<TreeNode*> in, s;
        while (p != NULL){
            if (p->left == NULL&&p->right == NULL){
                in.push(p);
                path.push_back(p->val);
                re.push_back(v2s(path));
                if (s.empty())
                    return re;
                else {
              // 通过while循环,查找下一个需要遍历的点
    while (!in.empty() && !s.empty() && (in.top())->right != s.top()){ in.pop(); path.erase(path.end()-1); } p = s.top(); s.pop(); } } else if (p->left == NULL&&p->right != NULL){ path.push_back(p->val); in.push(p); p = p->right; } else if (p->left != NULL&&p->right == NULL){ path.push_back(p->val); in.push(p); p = p->left; } else{ path.push_back(p->val); in.push(p); s.push(p->right); p = p->left; } } return re; } };

     另一道相似题目

    有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

    给定二叉树的根节点root,请返回所求距离。

    思路:只需要将保存的路径进行比较,相同的去掉然后相加,就能算出路径长度。

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Tree {
    public:
    int getDis(TreeNode* root) {
    	// write code here
    	stack<TreeNode*> max, min;
    	int m = INT_MIN, n = INT_MAX, re = 0;
    	stack<TreeNode*> in, s;
    	TreeNode *p = root;
    	while (p != NULL){
    		if (p->left == NULL&&p->right == NULL){
    			in.push(p);
    			if (p->val > m){
    				max = in;
    				m = p->val;
    			}
    			if (p->val < n){
    				min = in;
    				n = p->val;
    			}
    			while (!in.empty() && !s.empty() && (in.top())->right != s.top()){
    				in.pop();
    			}
    			if (s.empty())
    				break;
    			else {
    				p = s.top();
    				s.pop();
    			}
    		}
    		else if (p->left == NULL&&p->right != NULL){
    			in.push(p);
    			p = p->right;
    		}
    		else if (p->left != NULL&&p->right == NULL){
    			in.push(p);
    			p = p->left;
    		}
    		else {
    			in.push(p);
    			s.push(p->right);
    			p = p->left;
    		}
    	}
    	stack<TreeNode*> t1, t2;
    	while (!max.empty()){
    		t1.push(max.top());
    		max.pop();
    	}
    	while (!min.empty()){
    		t2.push(min.top());
    		min.pop();
    	}
    	while (!t1.empty() && !t2.empty()){
    		if (t1.top() != t2.top())
    			break;
    		else
    			t1.pop(); t2.pop();
    	}
    	re = re + t1.size() + t2.size();
    	return re;
    }
    };
    

      

  • 相关阅读:
    java-工具代码
    idea-常用快捷键
    idea-环境配置
    mysql-常用命令
    Java IO流学习总结
    Java类加载机制
    Struts2标签 %{ } %{# }详解
    EL语法
    SQL语句
    在servlet转向jsp页面的路径问题
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5734099.html
Copyright © 2011-2022 走看看