1. 程式人生 > 實用技巧 >劍指 Offer 36. 二叉搜尋樹與雙向連結串列 - 8月18日

劍指 Offer 36. 二叉搜尋樹與雙向連結串列 - 8月18日

題目

劍指 Offer 36. 二叉搜尋樹與雙向連結串列

我的思路

中序遍歷一次,用一個輔助變數儲存上一次訪問的節點指標,訪問時: 1.把上一次訪問的節點的右節點指向當前節點 2.把當前節點的左指標指向上一次訪問的節點 3.把當前節點設定為preNode
個人理解在這裡遍歷的同時修改樹的結構是不會有影響的。因為當前訪問的左子樹上的節點一定在訪問當前節點以前被訪問,訪問過的節點的右孩子會在雙親被訪問後立即呼叫,所以修改右孩子指標也不影響。關鍵要最後把首尾節點連線起來

我的實現

/*
// 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 { Node* preNode; Node *tailNode; Node *headNode; void visit(Node *root){ //cout<<root->val<<endl; preNode->right = root; root->left = preNode; preNode = root; } void midSearch(Node *root){ if(root!=NULL){
if(root!=tailNode||root!=headNode){ midSearch(root->left); visit(root); if(root->right!=headNode) midSearch(root->right); } else{ visit(root); } } } public
: Node* treeToDoublyList(Node* root) { tailNode = root; headNode = root; if(tailNode!=NULL){ while(tailNode->right!=NULL)tailNode = tailNode->right; while(headNode->left!=NULL)headNode = headNode->left; preNode = tailNode; midSearch(root); } return headNode; } };

拓展學習