輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
暴力解法
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
int numleft = k;
vector<
int>
prel
(preorder.
begin()
+1, preorder.
begin()
+ k +1)
; vector<
int>
prer
(preorder.
begin()
+ k +
1, preorder.
end())
;//取一段區間重設二叉樹;
vector<
int>
inl(inorder.
begin()
, inorder.
begin()
+ k )
; vector<
int>
inr(inorder.
begin()
+ k +
1, inorder.
end())
; root-
>left =
buildtree
(prel, inl)
; root-
>right =
buildtree
(prer, inr)
;return root;}}
;
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
treenode*
create
(int prel,
int prer,
int inol,
int inor)
};
輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。
思路:
迭代法:設立乙個標籤值layer,每次layer加一意味著把上一層的節點值從佇列中清空;
遞迴法:直接求最長路徑,每次返回取左子樹和右子樹最大值加1;
class
solution
if(temp->right != null)
q.push(temp->right);
}layer++;
}return layer;
}*/// 迭**法:耗時久
intmaxdepth
(treenode* root)
//使用max函式
};
思路:遞迴,每次交換左子樹和右子樹位置
class
solution
void
reverse
(treenode*
&root)
reverse
(root-
>left)
;reverse
(root-
>right);}
};
二叉樹相關題目可以優先考驗遞迴
給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。
你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。
思路:遞迴解決,重點是邊界條件的劃分:
a. 兩個數都為空,返回
b. 兩個樹節點都不為空,節點值相加給第一顆樹節點
c. 有一顆樹節點為空,返回(直接取不為空的另乙個樹節點位址)
class
solution
void
sum(treenode*
&t1, treenode* t2)
else
if(t1 ==
null
&& t2 !=
null
)else
if(t1 !=
null
&& t2 ==
null
)return
;sum
(t1-
>left, t2-
>left)
;sum
(t1-
>right, t2-
>right);}
};
二叉樹 力扣刷題
把二叉樹上的每乙個節點的左右子節點進行交換 definition for a binary tree node.public class treenode class solution 給定乙個 完美二叉樹 其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下 struct node ...
力扣刷題 合併二叉樹
題目描述 給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。算是第一次正式用力扣刷題,思路上是有想法的,但回...
刷題39 二叉樹的直徑 力扣)
題目鏈結題目描述 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹1 2 3 4 5返回 3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。關鍵技術 df...