將滿二叉樹轉換為求和樹

2021-10-05 04:35:31 字數 3406 閱讀 1488

在網上看到乙個道題目覺的有些意思分享給大家。

/**

* 給滿出二叉樹,編寫演算法將其轉化為求和樹

* * 什麼是求和樹:二叉樹的求和樹, 是一顆同樣結構的二叉樹,其樹中的每個節點將包含原始樹中的左子樹和右子樹的和。

* * 二叉樹:

* 10

* / \

* -2 6

* / \ / \

* 8 -4 7 5

* * 求和樹:

* 20(4-2+12+6)

* / \

* 4(8-4) 12(7+5)

* / \ / \

* 0 0 0 0

* * 二叉樹給出前序和中序輸入,求和樹要求中序輸出;

* 所有處理資料不會大於int;

* * 輸入描述:

* 2行整數,第1行表示二叉樹的前序遍歷,第2行表示二叉樹的中序遍歷,以空格分割

* 輸出描述:

* 1行整數,表示求和樹的中序遍歷,以空格分割

* 示例1

* 輸入

* 複製

* 10 -2 8 -4 6 7 5

* 8 -2 -4 10 7 6 5

* 輸出

* 複製

* 0 4 0 20 0 12 0

*/

結果要求是求和中序,那麼首先將中序的結果陣列(int result)先建立起來,這個「結果陣列」肯定和輸入的中序字串的順序是一樣的,只需要將陣列中的每個元素填充即可。

就是將原中序元素下的左右子樹元素值都加起來放到該位置上,也就是將以「原中序元素」為根的整顆二叉樹元素相加再減去根元素的值。比如根據前序字串"10 -2 8 -4 6 7 5"的第乙個數字「10」和中序字串 "8 -2 -4 10 7 6 5"中的「10」在第4個位置就可知道「結果陣列」中的第4個位置的值為 (10 -2 + 8 - 4 + 6 + 7 + 5 )- 10 = 20;

/**

* 給滿出二叉樹,編寫演算法將其轉化為求和樹

* * 什麼是求和樹:二叉樹的求和樹, 是一顆同樣結構的二叉樹,其樹中的每個節點將包含原始樹中的左子樹和右子樹的和。

* * 二叉樹:

* 10

* / \

* -2 6

* / \ / \

* 8 -4 7 5

* * 求和樹:

* 20(4-2+12+6)

* / \

* 4(8-4) 12(7+5)

* / \ / \

* 0 0 0 0

* * 二叉樹給出前序和中序輸入,求和樹要求中序輸出;

* 所有處理資料不會大於int;

* * 輸入描述:

* 2行整數,第1行表示二叉樹的前序遍歷,第2行表示二叉樹的中序遍歷,以空格分割

* 輸出描述:

* 1行整數,表示求和樹的中序遍歷,以空格分割

* 示例1

* 輸入

* 複製

* 10 -2 8 -4 6 7 5

* 8 -2 -4 10 7 6 5

* 輸出

* 複製

* 0 4 0 20 0 12 0

* @author: hu

* @date: 2020-04-17 18:45

*/public class treetestmain

/*** 輸入兩行前序和中序的字串,列印求和樹的中序遍歷

* @param prestr

* @param instr

*/public void outintreeresult(string prestr, string instr)

}private void setresultintarr(int pre, int in, int originin, int result)

int rootnum = pre[0];

int sum = 0;

for(int i = 0; i < in.length; i++)

sum -= rootnum;

for(int i = 0; i < originin.length; i++)

}if(in.length == 1)

treearr childin = getintreearr(rootnum , in);

if(childin != null)

}private treearr getpretreearr(int inleftlength , int pre)

int leftarr = new int[inleftlength];

int rightarr = new int[pre.length - 1 -inleftlength];

for(int i = 1; i < pre.length; i++) else

}return new treearr(leftarr, rightarr);

}private treearr getintreearr(int rootnum , int in)

int rootposition = -1;

for(int i = 0; i < in.length; i++)

}int leftarr = new int[rootposition];

int rightarr = new int[in.length - 1 -rootposition];

for(int i = 0; i < in.length; i++) else if(i > rootposition)

}return new treearr(leftarr, rightarr);

}/**

* 將字串轉為int陣列

* @param str

* @return

*/private int getintarr(string str)

return intarr;

}private class treearr

int left;

int right;

}}

快手筆試題 將滿二叉樹轉換為求和樹

給滿出二叉樹,編寫演算法將其轉化為求和樹 什麼是求和樹 二叉樹的求和樹,是一顆同樣結構的二叉樹,其樹中的每個節點將包含原始樹中的左子樹和右子樹的和。二叉樹 10 2 6 8 4 7 5 求和樹 20 4 2 12 6 4 8 4 12 7 5 0 0 0 0 二叉樹給出前序和中序輸入,求和樹要求中序...

python 將滿二叉樹轉換成求和樹

思路 根據前序遍歷和中序遍歷構造樹,唯一的區別在於 根節點的取值 不再是root.val而是sum pre 1 除了根節點之外的所有節點和。class tree def init self,x self.val x self.left none self.right none pre list ma...

樹轉換為二叉樹

輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 n n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的兒子序列,以0結束。若ai後僅含乙個...