業(yè)務(wù)員自己做網(wǎng)站新網(wǎng)絡(luò)營(yíng)銷(xiāo)
1、二叉樹(shù)前中后序遍歷:https://blog.csdn.net/cm15835106905/article/details/124699173
2、輸入一棵二叉搜索樹(shù),將該二叉搜索樹(shù)轉(zhuǎn)換成一個(gè)排序的雙向鏈表。要求不能創(chuàng)建任何新的結(jié)點(diǎn),只能調(diào)整樹(shù)中結(jié)點(diǎn)指針的指向。
public class Solution {private TreeNode prev = null; // 用于記錄鏈表的前一個(gè)節(jié)點(diǎn)private TreeNode head = null; // 頭節(jié)點(diǎn)public TreeNode convertToDoublyLinkedList(TreeNode root) {if (root == null) {return null;}inOrderConvert(root);return head;}private void inOrderConvert(TreeNode node) {if (node == null) {return;}// 遞歸遍歷左子樹(shù)inOrderConvert(node.left);// 將當(dāng)前節(jié)點(diǎn)鏈接到前一個(gè)節(jié)點(diǎn)if (prev == null) {// 當(dāng)前節(jié)點(diǎn)是最左節(jié)點(diǎn),賦值為頭節(jié)點(diǎn)head = node;} else {// 將前一個(gè)節(jié)點(diǎn)的right指向當(dāng)前節(jié)點(diǎn)prev.right = node;// 當(dāng)前節(jié)點(diǎn)的left指向前一個(gè)節(jié)點(diǎn)node.left = prev;}// 更新前一個(gè)節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)prev = node;// 遞歸遍歷右子樹(shù)inOrderConvert(node.right);}public static void main(String[] args) {TreeNode root = new TreeNode(10);root.left = new TreeNode(6);root.right = new TreeNode(14);root.left.left = new TreeNode(4);root.left.right = new TreeNode(8);root.right.left = new TreeNode(12);root.right.right = new TreeNode(16);Solution solution = new Solution();TreeNode head = solution.convertToDoublyLinkedList(root);// 打印雙向鏈表while (head != null) {System.out.print(head.val + " ");head = head.right;}}
}
解釋:
變量定義:
prev 用于記錄當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
head 用于記錄轉(zhuǎn)換后的雙向鏈表的頭節(jié)點(diǎn)。
中序遍歷: 使用遞歸的方式遍歷二叉搜索樹(shù)。對(duì)于每個(gè)節(jié)點(diǎn):
遞歸遍歷左子樹(shù)。
處理當(dāng)前節(jié)點(diǎn),將 prev 節(jié)點(diǎn)的 right 指針指向當(dāng)前節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的 left 指針指向 prev 節(jié)點(diǎn)。
更新 prev 節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn)。
遞歸遍歷右子樹(shù)。
輸出雙向鏈表:
轉(zhuǎn)換完成后,我們可以遍歷鏈表進(jìn)行輸出,驗(yàn)證結(jié)果是否正確。
3、二叉樹(shù)深度
4、