331. Verify Preorder Serialization of a Binary Tree(C++实现)

One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as #.

     _9_
    /   \
   3     2
  / \   / \
 4   1  #  6
/ \ / \   / \
# # # #   # #

For example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node.

Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.

Each comma separated value in the string must be either an integer or a character '#' representing null pointer.

You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3".

Example 1:
"9,3,4,#,#,1,#,#,2,#,6,#,#"
Return true

Example 2:
"1,#"
Return false

Example 3:
"9,#,#,1"
Return false

算法思想一:(二叉树中所有节点的出度=入度)

  根结点有2出度0入度,分支结点有2出度1入度,空结点有0出度1入度。遍历序列,判断出度是否等于入度!

记 K=出度-入度。如果序列化是正确的,那么 K 在任何时刻都不会小于0,并且最终结果等于0!

<span style="font-size:18px;">class Solution {
public:
    string toA(string a){//将a=“3,#,#,2,#,#”变成A=“1##1##”
        const int n=a.size();
	    string A;
	    int i=0;
	    while(i<n){
		    if(a[i]==',')
			    ++i;
		    else if(a[i]=='#'){
			    A+="#";
			    ++i;
		    }
		    else{
			    A+="1";
			    while(i<n&&a[i]!=','&&a[i]!='#')
				    ++i;
		    }
	    }
	    return A;
    }
</span>

<span style="font-size:18px;">
    bool isValid(string s){//形参的格式为A="11##1##";
        int k=1;
        for(int i=0;i<s.size();++i){
            k--;
            if(k<0)return false;
            if(s[i]=='1')
                k+=2;
        }
        return k==0;
    }</span>
<span style="font-size:18px;">bool isValidSerialization(string a) {
	string s=toA(a);
	return isValid(s);
}
};</span>



算法思想二:

遍历字符串,如果碰到连续的“数字,#,#”,就将其替换为一个“#”入栈,最后字符串若仅剩一个‘#’就是true。

程序中:

首先将a=“3,#,#,2,#,#”变成A=“1##1##” 形式。利用栈(Stack)数据结构实现上述算法

<span style="font-size:18px;"><span style="font-size:18px;">class Solution {
public:
    string toA(string a){//将a=“3,#,#,2,#,#”变成A=“1##1##”
        const int n=a.size();
	    string A;
	    int i=0;
	    while(i<n){
		    if(a[i]==',')
			    ++i;
		    else if(a[i]=='#'){
			    A+="#";
			    ++i;
		    }
		    else{
			    A+="1";
			    while(i<n&&a[i]!=','&&a[i]!='#')
				    ++i;
		    }
	    }
	    return A;
    }
    bool isValid(string A){//形参的格式为A="11##1##";
        const int n=A.size();
        if(A[0]=='#'&&n==1)return true;
        if(n<3)return false;
    
	    if(A[0]=='#')return false;
	    stack<char> s;
	    s.push(A[0]);
	    int i=1;
	    while(!s.empty()&&i<n){
		    if(A[i]=='1'){
			    s.push(A[i]);
			    ++i;
		    }
		    else if(A[i]=='#'){
    			if(s.size()>1&&s.top()=='#'){
	    			s.pop();
		    		if(s.top()=='1'){
			    		s.pop();
				    	if(s.empty()){
					    	s.push(A[i]);++i;
					    }
    				}else{
	    				s.push('#');
		    			s.push(A[i]);
			    		++i;
				    }
    			}
	    		else {
		    		s.push(A[i]);
			    	++i;
			    }
		    }
	    }
	    if(s.size()==1&&s.top()=='#')return true;
	    return false;
    }
bool isValidSerialization(string preorder) {
	string s=toA(preorder);
	return isValid(s);
}
};</span></span>


Here is an example C++ program that creates a tree node at a specific position in a tree: ```c++ #include <iostream> #include <vector> using namespace std; struct TreeNode { int val; vector<TreeNode*> children; TreeNode(int x) : val(x) {} }; void createNode(TreeNode* root, vector<int> path, int pos, int val) { if (pos == path.size()) { root->children.push_back(new TreeNode(val)); return; } int index = path[pos]; createNode(root->children[index], path, pos + 1, val); } int main() { TreeNode* root = new TreeNode(1); root->children.push_back(new TreeNode(2)); root->children.push_back(new TreeNode(3)); root->children.push_back(new TreeNode(4)); vector<int> path = {1, 0}; // path to the node we want to create int val = 5; // value of the new node createNode(root, path, 0, val); // print the tree to verify the new node was added cout << root->val << endl; for (auto child : root->children) { cout << " " << child->val << endl; for (auto grandchild : child->children) { cout << " " << grandchild->val << endl; } } return 0; } ``` In this program, we define a `TreeNode` struct that represents a node in a tree. Each node has a `val` property representing its value, and a `children` vector representing its children. The `createNode` function takes a `root` parameter representing the root of the tree, a `path` parameter representing the path to the node we want to create (as a vector of indices), a `pos` parameter representing the current position in the path, and a `val` parameter representing the value of the new node. The function recursively traverses the tree along the path until it reaches the position where the new node should be created, and then adds the new node as a child of the current node. In the `main` function, we create a sample tree and then call the `createNode` function to add a new node with value 5 at position [1, 0] (i.e., the second child of the root's first child). We then print the tree to verify that the new node was added correctly.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值