已知二叉樹的中序序列是abcdefg,後序序列是bdcafge,求前序序列。二叉樹的後序序列是按照「左子樹」,「右子樹」,「根」的順序排列的,序列中最後乙個元素代表該二叉樹的根節點。
二叉樹的前序序列是按照「根」,「左子樹」,「右子樹」的順序排列的,序列中第乙個元素代表該二叉樹的根節點。故通過已知的後序序列可以發現根,作為前序序列的第乙個元素。
二叉樹的中序序列是按照「左子樹」,「根」,「右子樹」的順序排列的,根將左子樹的序列和右子樹的序列分割在左右兩邊。通過後序序列發現根,找到其在中序序列的位置,從而在中序序列中發現左子樹和右子樹並獲得它們的長度,最後在後序序列中找到對應的左子樹和右子樹的後序序列。
這樣求某二叉樹的前序序列,變成了求該二叉樹左子樹的前序序列和該二叉樹右子樹的前序序列。
一棵樹,先找到其根,將其壓入棧中,再將其分割成左右子樹,按左子樹,右子樹的順序,找子樹的根,將其壓入棧中,直到子樹不可分割,得到整棵樹的前序序列。
非遞迴解法和遞迴解法的思路相同,找到根,壓入棧,分割左右子樹,找到它們的根,壓入棧。/**
* 返回二叉樹的前序序列
* @param inorder
* @param postorder
* @returns preorder
*/function findpreorder (inorder, postorder) else
}(inorder, postorder)
return preorder
// 返回前序序列
}let preorder = findpreorder(array.from('abcdefg'), array.from('bdcafge'))
console.log(preorder)
// [ 'e', 'a', 'c', 'b', 'd', 'g', 'f' ]
不同之處在於用inorderarr儲存待分割的樹的中序序列,用postorderarr儲存待分割的樹的後序序列。
const findpreorder = (inorder, postorder) => else
} return preorder
// 返回前序序列
}let preorder = findpreorder(array.from('abcdefg'), array.from('bdcafge'))
console.log(preorder)
// [ 'e', 'a', 'c', 'b', 'd', 'g', 'f' ]
已知二叉樹的前序序列是eacbdgf,中序序列是abcdefg,求後序序列。通過前序序列找到根,找到根在中序序列的位置,將樹分割成左右子樹,按照先右子樹再左子樹的順序找到子樹的根,直至子樹不可分割。先找到的根排在後找到的根的後面。和推導前序序列,相比思路大致相同,實現細節上,找樹的根的方式不同,分割子樹的方式不同,儲存根的方式不同。
非遞迴解法和遞迴解法的思路相同,找到根並儲存,分割左右子樹,找到它們的根並儲存。const findpostorder = (preorder, inorder) => else
}(preorder, inorder)
return postorder
// 返回後序序列
}let postorder = findpostorder(array.from('eacbdgf'), array.from('abcdefg'))
console.log(postorder)
// [ 'b', 'd', 'c', 'a', 'f', 'g', 'e' ]
不同之處在於用preorderarr儲存待分割的樹的前序序列,用inorderarr儲存待分割的樹的中序序列,且每次取最後乙個元素開始處理。
那是不可能的!const findpostorder = (preorder, inorder) => else
} return postorder
}console.log(findpostorder(array.from('eacbdgf'), array.from('abcdefg')))
// [ 'b', 'd', 'c', 'a', 'f', 'g', 'e' ]
已知前序序列abc,後序序列cba,求中序序列。這是一道多解題。推薦結合nodemon在node環境下學習演算法。
二叉樹遍歷 推導總結
第一次總結,個人淺見,望大牛們輕削,怕疼,呵呵 1.已知前序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。2.已知後序遍歷和中序遍歷序列,可以唯一確定一棵二叉樹。3.已知後續遍歷和前序遍歷序列,不能唯一確定一棵二叉樹。綜上 要想唯一確定乙個二叉樹,必須要有中序遍歷序列。遍歷規則 1 先序或者前序遍歷規...
二叉樹推導
3 二叉樹的推導 3.1 由前序中序推導 已知一棵二叉樹的前序序列和中序序列,構造該二叉樹的過程如下 根據前序序列的第乙個元素建立根結點 在中序序列中找到該元素,確定根結點的左右子樹的中序序列 在前序序列中確定左右子樹的前序序列 由左子樹的前序序列和中序序列建立左子樹 由右子樹的前序序列和中序序列建...
根據二叉樹遍歷結果反推樹
已知前序 中序遍歷,求後序遍歷 例 前序遍歷 gdafemhz 中序遍歷 adefghmz 根據前序遍歷的特點,我們知道根結點為g 觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。觀察左子樹adef,左子樹的中的根節點必然是...