題目要求:表示一棵二叉樹中序遍歷結果,
1.求有多少種可能的二叉樹結構?
2.返回所有可能的二叉樹結構的頭結點?
題目解析:
1.乙個關鍵點是:中序遍歷一棵二叉樹結果有序無重複,那麼這棵二叉樹必然是搜尋二叉樹。根據搜尋二叉樹的性質,結點1一定沒有左子樹,所以結點1為頭結點可能的二叉樹結構數目取決於其右子樹的結點數目。假設num(x)表示x個節點可能的二叉樹結構數目,那麼以1為頭結點的二叉樹結構數目就是num(n-1);現在以任意節點i為頭結點的可能二叉樹結構的個數取決於其左子樹和右子樹的可能數的乘積,即num(i-1)*num(n-i),okay,說到這裡第乙個問題已經可以解決了,遞迴加動態規劃降低時間複雜度解決此問題。
下面看一下**,no code say what:
// 問題1
int numtree(int n)
}return num[n];
}
2.第二個問題與第乙個問題類似,但要比第乙個問題複雜一些。現在要返回所有可能的二叉樹結構的頭結點,那麼就要把每一種可能的二叉樹結構構造出來。現在假設用結點i是頭結點,把左子樹所有可能的頭結點存在listleft中,把所有可能的右子樹可能的頭結點儲存在rightleft中,那麼所有的左子樹頭結點和右子樹頭結點組合就能產生出一種可能的二叉樹結構,把所有的可能結果儲存在listres中,返回即可。
首先定義二叉樹結點結構,和乙個拷貝結點方法,該拷貝方法可以拷貝整棵樹。
struct node ;
node * clonenode(node * node)
node * n =
new node();
n->value = node->value;
n->left = clonenode(node->left);
n->right = clonenode(node->right);
return n;
}
然後看一下問題2的生成演算法:
// 問題2
bool generatetrees(int n, list
&res)
generate(1, n, res);
return
true;
}/* param: 以start為開始頭結點
* param: 以end為結束頭結點
*/void generate(int start, int end, list
&res)
for (int i = start, i <= end; ++i) }}
return ;
}
okay,到這裡這個問題已經完美解決了…
路漫漫其修遠兮,吾將上下而…
資料結構和演算法經典100題 第27題
已知一棵二叉樹的每個節點的值都不同,給定這個二叉樹的先序和中序遍歷陣列,不要重建整棵二叉樹,而知通過給定的陣列直接生成正確的後序陣列。include include include include using namespace std int setpos int prearray,int pre...
資料結構和演算法經典100題 第29題
題目要求 二叉樹節點間的最大距離問題從二叉樹的節點a出發,可以向上走或者向下走,但沿途的節點只能經過一次,當達到節點b時,路徑上的節點數叫作a到b的距離。比如 1 2 3 4 5 6 7節點4和節點2的距離為2,節點5和節點6的距離為5。現在給定一棵二叉樹的頭結點,求整棵二叉樹上節點間的最大距離。題...
資料結構和演算法經典100題 第30題
題目要求 先序 中序和後序陣列兩兩結合重構二叉樹已知一棵二叉樹的所有節點都不同,給定二叉樹的先序 中序和後序陣列,請分別用三個函式實現任意兩種組合重構原來的二叉樹,並返回重構二叉樹的頭節點。題目解析 這道題目中,由先序陣列,中序陣列組合重構二叉樹無難度,同理由中序陣列,後序陣列結合重構二叉樹也沒有難...