• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 二叉树中序遍历以栈的方式实现,不知哪里逻辑错误了?

二叉树中序遍历以栈的方式实现,不知哪里逻辑错误了?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了中序遍历二叉树,二叉树的中序遍历算法,非递归中序遍历二叉树,中序遍历二叉树递归,二叉树中序遍历图等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:二叉树中序遍历以栈的方式实现,不知哪里逻辑错误了?
描述:

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

#include<vector>
#include<iostream>
#include<stack>

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<int> inorderTraveral(TreeNode *root){
    vector<int> res;
    stack<TreeNode *> 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<<root->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<<endl;

    vector<int> res;
    res = inorderTraveral(root);

    for(vector<int>::iterator it = res.begin(); it != res.end();it++){
        cout<<*it<<" ";
    }
    cout<<endl;
}

输出陷入死循环,如下:

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

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

#include<iostream>
#include<stack>

using namespace std;
bool seqIsValid(const char*);
char seqRight(char);

bool seqIsValid(const char *str){
    stack<char> 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<<"seq is valid;"<<endl;
    }else{
        cout<<"is not valid"<<endl;
    }
}

解决方案1:

vector<int> inorderTraveral(TreeNode *root){
    vector<int> res;
    stack<TreeNode *> s;
    TreeNode *pTree = new TreeNode(); //1

    if(root != nullptr){
        s.push(root);
    }

    while(!s.empty()){
        pTree = s.top();

        if(pTree->left != nullptr){ //2
            s.push(pTree->left);
            continue;
        }
        res.push_back(pTree->val);
        s.pop();

        if(pTree->right != nullptr) 
            s.push(pTree->right);

    }
    return res;
}

1、为什么这里要new TreeNode()?
2、你想想,遍历到第一个节点后,你将这个节点从栈里pop()了,然后你又拿了个top()指针,也就是这个节点的parent,然后访问left,这不就是你刚才访问的第一个节点么?这里就死循环了!

           root
          /
        a1
       /
     a2
    /
  null

一开始建立的栈是这样:

a2
a1

当你运行到:

    res.push_back(pTree->val);
    s.pop();

时,栈是这样:

a1

这时top()拿出来的就是a1,然后if(pTree->left != nullptr),悲剧了:)


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 二叉树的遍历二叉树先序遍历时没有进入递归。
  • 二叉树中序遍历以栈的方式实现,不知哪里逻辑错误了?

相关文章

  • 2017-06-07 “wwwbaiducom”和“wwwbaiducom/”哪种访问方式速度快?
  • 2017-06-07 (python)pexpect脚本执行无报错,但是没有执行结果
  • 2017-06-07 七牛C/C++SDK可以多服务端吗?
  • 2017-06-07 请问JBoss51到底商用需要收费吗?
  • 2017-06-07 (VFP)如何在表格中单击绑定的下拉框后弹出1个容器控件选择数据?
  • 2017-06-07 djangodjango前端模板
  • 2017-06-07 python爬虫关于Python爬虫抓取网页源码的编码问题
  • 2017-06-07 Django创建超级用户问题,急求助
  • 2017-06-07 Lua的正则不兼容Posix语法,下面的代码就跟预期的不一致
  • 2017-06-07 flask-restful浏览器访问api提示下载json文件

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Python的代码应该如何显式地引用?
    • 使用python实现移动飞信发送短信的http接口
    • c语言问题。求救~~~~
    • laravel编写的blogcms如何优雅的切换主题
    • ubuntu终端光标如何取消闪烁?
    • AndroidStudio如何设置设计界面中默认的API?
    • jBPM能否用来开发有几十万用户的大型工作流网站?
    • 求推荐个ftpserverforMacOSX?
    • 如何方便的管理redis实例
    • pythonflask如何获取定义的全局变量值

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有