ZJ26_二叉搜索树与双向链表

ZJ26_二叉搜索树与双向链表

知识点:二叉树、链表、分治
题目链接

题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解题思路

  1. 采用中序遍历 把结点都放入一个数组中保存 然后再把他们连起来
  2. 不用数组 用一个pre结点保存前一个结点 直接在中序遍历 把他们连起来

代码

#include "cheader.h"
 struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
     TreeNode(int x) :
     val(x), left(NULL), right(NULL) {
     }
 };
class Solution1 {
public:
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree == nullptr)
            return nullptr;
        vector<TreeNode*> v;
        pushNode(v,pRootOfTree);
        TreeNode* pre = v[0];
        for(int i = 1; i < v.size();i++){
            TreeNode *cur = v[i];
            cur->left = pre;
            pre->right = cur;
            pre = cur;
        }
        return v[0];
    }
    void pushNode(vector<TreeNode*>& v,TreeNode *root){
        if(root == nullptr)
            return;
        pushNode(v, root->left);
        v.push_back(root);
        pushNode(v, root->right);
    }
};

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;

    Node() {}

    Node(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
public:
    Node* pre,*head;
    Node* treeToDoublyList(Node* root) {
        if(root == NULL)
            return root;
        dfs(root);
        head->left = pre;
        pre->right = head;
        return head;
    }
    void dfs(Node* root){
        if(root == NULL)
            return;
        dfs(root->left);
        if(pre == NULL)
            head = root;
        else
            pre->right = root;
        root->left = pre;
        pre = root;
        dfs(root->right);
    }
};


今天也是爱zz的一天!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值