c++ ptree判断是否存在节点_二叉树中序遍历以栈的方式实现,不知哪里逻辑错误了?...

本文通过一个C++代码示例,展示了在实现二叉树中序遍历过程中遇到的死循环问题,并提供了解决方案。代码包括递归与非递归两种遍历方式,以及一个检查括号序列有效性的函数作为参考。在问题修复后,程序能够正确地进行中序遍历和检查括号序列。
摘要由CSDN通过智能技术生成

自己以栈的方式实现了一遍二叉树中序遍历,运行也没问题,但似乎是陷入了死循环,有没有高人点播下,代码如下:

#include

#include

#include

using namespace std;

static int count = 0;

struct TreeNode{

int val;

TreeNode *left;

TreeNode *right;

TreeNode(int x = 0):val(x),left(NULL),right(NULL){}

};

//中序遍历

vector inorderTraveral(TreeNode *root){

vector res;

stack s;

TreeNode *pTree = new TreeNode();

if(root != nullptr){

s.push(root);

}

while(!s.empty()){

pTree = s.top();

if(pTree->left != nullptr){

s.push(pTree->left);

continue;

}

res.push_back(pTree->val);

s.pop();

if(pTree->right != nullptr)

s.push(pTree->right);

}

return res;

}

//递归遍历二叉树

void printTree(TreeNode *root){

cout<val<

if(root->left != nullptr){

printTree(root->left);

}

if(root->right != nullptr){

printTree(root->right);

}

}

//制造一个个数为k的完全二叉树

void makeTree(TreeNode* root,int k){

TreeNode *tmpTree = new TreeNode(1);

sranddev();

tmpTree->val = rand()%100;

if(count < k && root->left == nullptr){

root->left = tmpTree;

count++;

}else if(count < k && root->right == nullptr){

root->right = tmpTree;

count++;

}

if(count < k){

makeTree(root->left,k);

makeTree(root->right,k);

}

}

int main(){

TreeNode *root = new TreeNode(10);

int size;

size = 10;

TreeNode *root1,*root2;

root1 = root2;

makeTree(root,10);

printTree(root);

cout<

vector res;

res = inorderTraveral(root);

for(vector::iterator it = res.begin(); it != res.end();it++){

cout<

}

cout<

}

输出陷入死循环,如下:

➜ leetcode ./a.out 10 14 90 14 80 42 40 63 30 81 16

谢谢你的提醒,后来参考了别人的代码,更改成功了,如下:

#include

#include

using namespace std;

bool seqIsValid(const char*);

char seqRight(char);

bool seqIsValid(const char *str){

stack strStack;

for(;*str != '\0';str++){

if(!strStack.empty()){

if(seqRight(strStack.top()) != *str){

strStack.push(*str);

}else{

strStack.pop();

}

}else{

strStack.push(*str);

}

}

if(!strStack.empty()){

return false;

}

return true;

}

char seqRight(char ch){

switch(ch){

case '[':

return ']';

case '{':

return '}';

case '(':

return ')';

default:

return '\0';

}

}

int main(){

const char* test = "[{()}]";

if(seqIsValid(test)){

cout<

}else{

cout<

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值