對二叉樹的節點來說, 有本身的值域, 有指向左孩子和右孩子的兩個指標; 對雙向鍊錶的節點來說,有本身的值域, 有指向上乙個節點和下乙個節點的指標。 在結構上, 兩種結構有相似性, 現在有一棵搜尋二叉樹, 請將其轉換為乙個有序的雙向鍊錶。
用兩種方法求解本題。
方法一:由於是搜尋二叉樹,直接求出其中序遍歷序列,構造雙向鍊錶即可。
#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...