331. 验证二叉树的前序序列化
我的思路
- 思考了一小会儿,感觉头绪很乱。想用栈,可是没想出来怎么用。昨晚失眠到凌晨四点半,整天不在状态。于是直接看了题解。发现了几种 有趣 的解法。
解法一:前序遍历建树
-
题目要求不让建树,但是可以模拟建树的过程,我们不真正建树,而是模拟前序建立二叉树的过程。
-
我们分析如下树:
1 / \ 2 3 /\ /\ 4 # # # / \ # #
序列应该是
1,2,4,#,#,#,3,#,#
。
假设我们需要根据这个前序遍历序列(显然这是一个合法的序列)建立一棵二叉树。显然,我们应该使用 递归 。我们可以写出大致如下的代码:Node* buildBinTree(string preorder, int &pos){ if (preorder[pos] == '#'){ 建立空节点; pos += 2; // 跳过, 返回该节点; } while (pos < n && isdigit(reorder[pos])){ pos ++; 记录下当前节点的值。 } pos ++; // 跳过, 建立新节点newNode; newNode->left = buildBinTree(preorder, pos); newNode->right = buildBinTree(preorder, pos); 返回newNode; }
我们现在思考如果这个序列是不合法的。显然,如果当
pos=n
时,也就是序列用完了,此时仍在建立某一棵树的过程中,那么,此时这个序列一定不合法。同样,当根节点的左右子树都已经建好了,然而此时pos < n
,也就是还有剩余节点,那么此时这个