洛谷(5018)
一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹:
二叉樹;
將這棵樹所有節點的左右子樹交換,新樹和原樹對應位置的結構相同且點權相等。
下圖中節點內的數字為權值,節點外的 idid 表示節點編號。
現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數 最多。請輸出這棵子樹的節點數。
注意:只有樹根的樹也是對稱二叉樹。本題中約定,以節點 tt 為子樹根的一棵「子 樹」指的是:節點tt 和它的全部後代節點構成的二叉樹。
輸入格式:
第一行乙個正整數 nn,表示給定的樹的節點的數目,規定節點編號 1 \sim n1∼n,其中節點 11 是樹根。
第二行 nn 個正整數,用乙個空格分隔,第 ii 個正整數 v_ivi代表節點 ii 的權值。
接下來 nn 行,每行兩個正整數 l_i, r_ili,ri,分別表示節點 ii 的左右孩子的編號。如果不存在左 / 右孩子,則以 -1−1 表示。兩個數之間用乙個空格隔開。
輸出格式:
輸出檔案共一行,包含乙個整數,表示給定的樹的最大對稱二叉子樹的節點數。
建立節點tree結構體,建立結構體陣列tree_g[maxa],從i=0:n,將權值放入tree_g[i]
接下來n行兩個數a,b,i=1:n,tree_g[i].lift=&tree_g[a],tree_g[i].right=&tree_g[b],當a或b為-1,則左孩或右孩為null
檢驗對稱無非是比較另兩個節點的權值是否相等,兩個節點的第乙個的左孩與第二個節點的右孩、第乙個的右孩與第二個節點的左孩權值是否相等,直到這兩個節點不存在即null,work(tree &a,tree &b)
遍歷每個節點,當此節點左孩右孩權值相等,進入work(tree_g[i].lift,tree_g[i].tight),中途加個flag標誌當不匹配就不在進行遞迴,cnt,ans用於記錄更新答案
#include using namespace std;int n,a,b,flag=1,ans=1,cnt;
struct tree tree_g[1000010];
void work(tree *a, tree *b)
else if (a->v == b->v)
else flag = 0;
}int main()
for (int i = 1; i <= n; ++i)
}printf("%d", ans);
return 0;
}
對稱二叉樹c 對稱的二叉樹
很簡單,關鍵還是知道怎麼樣才能判斷乙個 二叉樹是否對稱,只要採用前序 中序 後序 層次遍歷等任何一種遍歷方法,分為先左後右和先 右後左兩種方法,只要兩次結果相等就說明這棵樹是一顆對稱二叉樹。迭代版本 class solution public bool issymmetric treenode ro...
對稱二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。這題還是蠻簡單的。對稱二叉樹 include using namespace std struct treenode bool issymmetrical treenode proot1,t...
對稱二叉樹
請實現乙個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果乙個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。solution public class treenode 我們可以通過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是不是對稱的 public class solution bo...