二叉树相关问题

给定一个初始为空的栈,和n个操作组成的操作序列,每个操作只可能是出栈或入栈

要求在操作序列的执行过程中不会出现非法操作,即不会再空栈时执行出栈操作,同时保证当操作序列完成是栈恰好为空

求符合条件的序列个数

1<=n<=1000

思路:利用栈层次顺序建一棵二叉树,二叉树的节点的值非1即-1(1表示进栈,-1表示出栈)

如n=4,二叉树如下:(8种可能序列)

1

1       -1

1  -1    1   -1

1 -1  1 -1 1  -1  1  -1

满足的有    *    *             两种满足

#include <iostream>
#include <queue>
#include <assert.h>
using namespace std;

//二叉树节点数据结构
struct Node
{
	int _data;
	Node* _left;
	Node* _right;
	Node(const int& data)
		:_data(data)
		, _left(NULL)
		, _right(NULL)
	{}
};

//全局队列
queue<Node*> q;

Node* GetNode(const int& x)
{
	return new Node(x);
}

//先序遍历,递归
Node* PrevOrder(Node* root, const int& half, int& sum, int& valied)
{
	if (root == NULL){
		if (sum == 0)
			++valied;
		return NULL;
	}
	sum += root->_data;
	if (sum > half || sum < 0){
		//不合法,回退
		sum -= root->_data;
		return root;
	}
	else{
		Node* ret = PrevOrder(root->_left,half,sum,valied);
		if (ret == NULL){
			sum -= root->_data; 
			return root;
		}
		ret = PrevOrder(root->_right, half, sum, valied);
		sum -= root->_data;
		return root;
	}
}

int main()
{
	int n;
	while (1){
		cin >> n;
		if (n < 0 || n > 1000 || n % 2 != 0){
			cout << "n invailed,please input again:";
			continue;
		}
		if (n == 0)
			return 1;
		//利用队列,层次建一棵二叉树
		q.push(GetNode(1));
		Node* head = q.front();
		int half = n / 2;
		int tmp=pow(2.0,n-1)-1;//2^(n-1)-1
		while (tmp--){
			q.push(GetNode(1));
			q.front()->_left = q.back();
			q.push(GetNode(-1));
			q.front()->_right = q.back();
			q.pop();
		}
		while (!q.empty()){
			q.pop();
		}
		//统计合法的进栈出栈序列
		int valied = 0;
		int sum = 0;
		Node* cur = head;

		//先序遍历
		Node* ret = PrevOrder(head,half,sum,valied);
		cout << valied << endl;

		//初始化厨师条件,一遍下一次循环使用
		valied = 0;
		sum = 0;
	}

	system("pause");
	return 0;
}

以上实现使用递归方法,递归的深度很深,可尝试使用非递归实现

《完》

时间: 2024-07-28 14:24:33

二叉树相关问题的相关文章

LeetCode:二叉树相关应用

LeetCode:二叉树相关应用 基础知识 617.归并两个二叉树 题目 Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not. You need to merge them into a new binary tree. The merge ru

acwing 70-72 剑指OFFER 二叉树相关

地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www.acwing.com/problem/content/submission/68/ 三道题都是二叉树相关 使用递归遍历即可解决 70. 二叉搜索树的第k个结点 给定一棵二叉搜索树,请找出其中的第k小的结点. 你可以假设树和k都存在,并且1≤k≤树的总结点数. 输入 输入:root = [2, 1,

二叉树相关

/* _递归的精髓在二叉树的各种问题上体现的淋漓尽致!!! */ #include<stdio.h> #include<iostream> #include <stack> #include<vector> #include <assert.h> using namespace std; typedef struct node //二叉树结点的结构体表示形式 { int data; node *left,*right; }BTree; //---

C++实现二叉树相关操作

测试环境:windows 7 vs2010 主要实现二叉树的初始化递归和非递归遍历,层次遍历,获取叶子节点的个数,获取树的高度以及镜像树,部分代码也参考了互联网上的相关资料. 源程序: BinaryTreeNode.h #ifndef _BINARY_NODE #define _BINARY_NODE #include<iostream> using namespace std; template<class ItemType> struct BinaryTreeNode { It

二叉树相关知识总结(三)

前两篇日志主要研究了二叉树的相关基本知识,以及二叉树的最基本的实现 今天我们主要研究下,二叉查找树的相关主要特点,以及Java实现. 一.概念 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值: 换句话说:中根遍历是有序的. (3)左.右子树也分别为二叉排序树: 思考:重复的值怎么处理?是否存在值一样的节点? 初始化一颗二叉排序树根节点的选取问题 p

二叉树相关基础知识总结

一:树的概念 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合.把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的.它具有以下的特点: 1:每个结点有零个或多个子结点: 2:没有父结点的结点称为根结点: 3:每一个非根结点有且只有一个父结点: 4:除了根结点外,每个子结点可以分为多个不相交的子树 二:树相关术语 节点的度:一个节点含有的子树的个数称为该节点的度: 叶节点或终端节点:度为0的节点称为叶节点: 非终端节点或分支节点:度不为0的节点:

二叉树相关题目总结

1. 简要介绍   关于二叉树问题,由于其本身固有的递归属性,通常我们可以用递归算法来解决.(<编程之美>,P253) 总结的题目主要以leetcode题目为主. 2. 测试用例 空树,只有节点的二叉树,只有左子树/右子树的二叉树,既有左子树右有右子树的二叉树. 3. 二叉树的遍历 遍历简介: 二叉树的遍历 分层遍历:二叉树分层遍历 前序遍历:[LeetCode] Binary Tree Preorder Traversal 中序遍历:[LeetCode] Binary Tree Inorde

[原创]二叉树相关笔试题代码

1 //二叉树问题集: 2 //20140822 3 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 #include <queue> 8 #include <stack> 9 #include <list> 10 using namespace std; 11 12 13 typedef int ElementType; 14 typedef stru

java实现二叉树相关代码-----数据结构

接口 /*1.开发时间:2014-11-5  *2.开发者:赵远  *3.维护者:赵远  *3.程序说明:树的接口  *4.注意事项:暂且没有  * **/ package Tree; import Tree.node; public interface TreeNode { // class Node {};  // 1. 求二叉树中的节点个数  int GetNodeNum(node root);  // 2. 求二叉树的深度  int GetDepth(node root);  // 3.