• 面试题 17.12. BiNode


    二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。

    返回转换后的单向链表的头节点。

    注意:本题相对原题稍作改动

    示例:

    输入: [4,2,5,1,3,null,6,0]
    输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]
    提示:

    节点数量不会超过 100000。

    code1:递归

    /**
     * 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 {
    private:
        void inorder(TreeNode *root, TreeNode *&tmp_head ){
            if(root == NULL)
                return ;
    
            inorder(root->left, tmp_head);
            tmp_head->right = root;
            root->left = NULL;
            tmp_head = root;
            inorder(root->right, tmp_head);
        }
    public:
        TreeNode* convertBiNode(TreeNode* root) {
            if(root == NULL)
                return NULL;
    
            TreeNode *head = new TreeNode(-1);
            TreeNode *tmp_head = head;
            inorder(root, tmp_head);
            return head->right;
        }
    };

     code2:非递归

    /**
     * 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:
        TreeNode* convertBiNode(TreeNode* root) {
            if(root == NULL)
                return NULL;
    
            TreeNode *head = new TreeNode(-1);
            TreeNode *tmp_head = head;
            stack<TreeNode *> stack;
            while(!stack.empty() || root){
                if(root){
                    stack.push(root);
                    root = root->left;
                }
                else{
                    root = stack.top();
                    stack.pop();
                    root->left = NULL;
                    tmp_head->right = root;
                    tmp_head = root;
                    root = root->right; 
                }
            }
            return head->right;
        }
    };
  • 相关阅读:
    Linux文件权限详解
    linux软链接和硬链接的区别
    linux vi编辑常用命令
    juery下拉刷新,div加载更多元素并添加点击事件(二)
    性能调优常见问题与方案
    测试人员怎么避免背黑锅?
    测试部工作检查观点
    如何为一组任务确定计划,估计每个任务所需的时间?
    测试人员和开发人员如何更高效的配合工作
    测试人员职业规划
  • 原文地址:https://www.cnblogs.com/tianzeng/p/13420214.html
Copyright © 2020-2023  润新知