劍指 Offer 36. 二叉搜尋樹與雙向連結串列 - 8月18日
阿新 • • 發佈:2020-08-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; } };