將搜尋二叉樹轉換成雙向鍊錶

2021-07-22 07:56:31 字數 1365 閱讀 2949

對二叉樹的節點來說, 有本身的值域, 有指向左孩子和右孩子的兩個指標; 對雙向鍊錶的節點來說,有本身的值域, 有指向上乙個節點和下乙個節點的指標。 在結構上, 兩種結構有相似性, 現在有一棵搜尋二叉樹, 請將其轉換為乙個有序的雙向鍊錶。

用兩種方法求解本題。

方法一:由於是搜尋二叉樹,直接求出其中序遍歷序列,構造雙向鍊錶即可。

#include #include #include using namespace std;

//雙向鍊錶結構體

struct dlistnode

};//二叉搜尋樹

struct bstnode

};//二叉搜尋樹插入節點

void insert(bstnode **root, int val)

if (val < (*root)->val)

insert(&((*root)->left),val);

else

insert(&((*root)->right),val);

}//中序遍歷二叉樹

void inorder(bstnode *root, vector&ret)

//方法一,利用中序排序得到二叉搜尋樹序列,構造雙向鍊錶t(n)=o(n) s(n)=o(n)

dlistnode *translate(bstnode *root)

//if

else //else

}//for

return head;

}//方法二,遞迴實現,t(n)=o(n) s(n)=o(h)

dlistnode *translate2(bstnode *root)

//if

else if (lend != null)

else if (rend != null)

else

}//遍歷雙向鍊錶

void display(dlistnode *head)

//while

cout << endl;

}int main()

; bstnode *root = null;

for (auto iter = v.begin(); iter != v.end(); ++iter)

//for

dlistnode *head = translate(root);

display(head);

dlistnode *end = translate2(root);

head = end->next;

end->next = null;

display(head);

system("pause");

return 0;

}

將搜尋二叉樹轉換成雙向鍊錶

題目 對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標 對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。public class convertdn public static ...

將搜尋二叉樹轉換成雙向鍊錶

題目 將搜尋二叉樹轉換成雙向鍊錶 程式設計師 面試指南 第26題 p81 難度 尉 頭一回做二叉樹的題,著實有點艱難。首先就倒在了牛客上面生成二叉樹的問題。題目給的示例輸入是這樣子的 9 6 4 7 4 2 5 2 1 3 5 0 0 1 0 0 3 0 0 7 0 9 9 8 0 8 0 0如果按...

將二叉樹轉換成雙向鍊錶

思路 採用中序遍歷的方法,visit函式須要完畢的功能為 1 當前節點的左子節點指向上一次訪問的節點 2 將上一次訪問節點的右子節點指向當前節點 3 最後更新上一次訪問節點為當前節點。在第二步時須要推斷上一次訪問節點是不是為null,假設是,則第二步改為鍊錶的頭結點指向當前節點。程式例如以下 str...